链接 Howard Hinnat 的日期时间库时出现异常错误

问题描述 投票:0回答:1

我正在尝试链接以下代码

#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

红帽企业 Linux 版本 8.10 (Ootpa)

gcc --版本

gcc(GCC)8.5.0 20210514(红帽8.5.0-22)

g++ --版本

g++ (GCC) 8.5.0 20210514(红帽 8.5.0-22)

实际上,当我尝试在应用程序中添加代码时出现错误。这是我可以重现的最小示例。

c++ datetime timezone
1个回答
0
投票

无论出于何种原因,您都没有链接到 tz.cpp(其中定义了

date::locate_zone
)。 恕我直言,最简单的事情不是使用 CMake 构建系统,而是编译并链接到 tz.cpp。

我建议遵循此处的构建说明:https://howardhinnant.github.io/date/tz.html#Installation

无论您使用什么配置标志,您都需要对文件(包括 tz.h)和 tz.cpp 使用相同的配置标志。

© www.soinside.com 2019 - 2024. All rights reserved.