You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链接Howard Hinnat日期时间库时出现未定义引用异常错误

问题分析:date::locate_zone 未定义引用错误

问题重现

测试代码

#include "date/tz.h"
#include <chrono>
#include <iostream>

int
main()
{
    using namespace date;
    //using namespace std;
    //using namespace chrono;

    auto tz = locate_zone("America/New_York");
    return 0;
}

编译链接命令

编译指令:

g++ -fsigned-char -g -O0 -std=c++17 -I/home/user1/date-master_debug/include -I/home/user1/date-master_debug -m64 -Wfatal-errors -c hh_is_dst.cc -o hh_is_dst.o

链接指令:

g++ -g -O0 -std=c++17 -I/home/user1/date-master_debug/include -m64 -Wfatal-errors -o hh_is_dst hh_is_dst.o -Wl,-Bdynamic -ldl -Wl,-Bstatic -L/home/user1/date-master_debug/build -ldate-tz -Wl,-Bdynamic -lstdc++ -lgcc -lgcc_eh -Wl,-Bdynamic -lm -lcrypt -lc -lrt -lpthread

错误信息

hh_is_dst.o: In function `main': /home/user1/hh_is_dst.cc:12: undefined reference to date::locate_zone(std::basic_string_view<char, std::char_traits<char> >)' 
collect2: error: ld returned 1 exit status

库编译命令

CXX=g++ CC=gcc CXXFLAGS='-g -O0 -fexceptions -std=c++17' /home/user1/utilities/cmake-3.21.1-linux-x86_64/bin/cmake --debug-trycompile --debug-output -DENABLE_DATE_TESTING=ON -DBUILD_TZ_LIB=ON -DMANUAL_TZ_DB=ON -DUSE_TZ_DB_IN_DOT=ON ../

CXX=g++ CC=gcc CXXFLAGS='-g -O0 -fexceptions -std=c++17' /home/user1/utilities/cmake-3.21.1-linux-x86_64/bin/cmake --build . --target testit --verbose

环境信息

cat /etc/redhat-release
Red Hat Enterprise Linux release 8.10 (Ootpa)
gcc --version
gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-22)
g++ --version
g++ (GCC) 8.5.0 20210514 (Red Hat 8.5.0-22)


可能原因及解决步骤

1. 编译参数不匹配

测试代码编译时添加了 -fsigned-char,但编译date-tz库时未使用该参数。GCC中-fsigned-char会改变char类型的符号属性,导致库中函数签名与代码引用的签名不匹配(std::basic_string_view<char>依赖char的符号属性)。

解决方法:

  • 编译库时同步添加-fsigned-char,修改CXXFLAGS:
    CXXFLAGS='-g -O0 -fexceptions -std=c++17 -fsigned-char'
    
  • 或者去掉测试代码编译命令中的-fsigned-char,保持与库编译参数一致。

2. 链接顺序问题

GCC链接器按顺序处理库文件,若库依赖其他库,需将依赖库放在后面。当前链接命令的静态/动态库切换逻辑可能打乱了依赖顺序。

解决方法:

  • 简化链接命令,调整库的顺序:
    g++ -g -O0 -std=c++17 -I/home/user1/date-master_debug/include -L/home/user1/date-master_debug/build hh_is_dst.o -ldate-tz -ldl -pthread -o hh_is_dst
    

3. 库文件有效性验证

虽然库已生成,但需确认libdate-tz.a中确实包含date::locate_zone的符号。

验证方法:

  • 用nm命令检查库内符号:
    nm -C /home/user1/date-master_debug/build/libdate-tz.a | grep locate_zone
    
    若没有输出目标符号,说明库编译时未生成该函数实现,需检查CMake配置。

4. CMake配置与编译清理

当前CMake命令包含调试选项,且MANUAL_TZ_DB等选项可能影响编译内容。

解决方法:

  • 清理编译目录后重新配置编译:
    cd /home/user1/date-master_debug/build
    rm -rf *
    CXX=g++ CC=gcc CXXFLAGS='-g -O0 -fexceptions -std=c++17 -fsigned-char' /home/user1/utilities/cmake-3.21.1-linux-x86_64/bin/cmake -DENABLE_DATE_TESTING=ON -DBUILD_TZ_LIB=ON -DMANUAL_TZ_DB=ON -DUSE_TZ_DB_IN_DOT=ON ../
    make -j$(nproc)
    
    确保编译过程无报错后,再重新链接测试代码。

5. C++标准支持适配

GCC 8.5对C++17的支持为部分支持,尝试切换到-std=gnu++17(包含GNU扩展),同时库编译也使用该选项。


内容的提问来源于stack exchange,提问作者tech1978

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:25:19