gpt4 book ai didi

c++ - boost program_options 中的链接错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:23 25 4
gpt4 key购买 nike

我正在尝试从源代码构建第 3 方 C++ 库,它依赖于 Boost。在构建的最后一步,我得到了这样的错误:

[ 90%] Linking CXX executable Shannon_RNASeq_Cpp
CMakeFiles/Shannon_RNASeq_Cpp.dir/src/main.cpp.o: In function `command_line_for_find_rep(int, char**, Shannon_C_setting&,
std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >&)':
/home/lambda/Shannon_Cpp_RNA_seq/src/main.cpp:320: undefined reference to `boost::program_options::options_description::options_description(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, unsigned int)'

我在 StackOverflow 上搜索了其他问题(例如 Boost Program Options link error ),最初认为是构建 Boost 非头部分的编译器不同导致的,所以我下载了 Boost 1.68.0 的源码并构建了它在我的个人目录中,使用我用来构建第 3 方库的相同编译器(编译器是 gcc 8.2.0),从错误消息中,我可以看出使用了 C++11 标准(你可以看到 cxx11 在错误消息中),因此不支持 C++11 的编译器不会像之前假设的那样导致问题(例如 undefined reference to boost::program_options in xubuntu )。要使用自定义编译器构建 Boost(服务器的默认编译器非常过时),我按照说明进行操作 here .

进一步搜索表明这是一个链接问题。第 3 方库必须由 CMake 构建,我按照上一个问题 ( How to link C++ program with Boost using CMake ) 的回答中的说明,将此行添加到第 3 方库根目录中的 CMakeLists.txt派对图书馆:

target_link_libraries(Shannon_RNASeq_Cpp ${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE})

但是,同样的问题仍然存在。我检查了文件 CMakeCache.txt,并确认使用了所需的编译器并且 Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE 指向我所在目录中的 libboost_program_options.so放 Boost 1.68.0(服务器有其他旧版本的 Boost)。然后,我使用 make VERBOSE=1 检查在构建库时调用的 bash 命令。命令听起来没有错; Boost program_options 库已链接;这是来自 make VERBOSE=1 的命令:

/usr/bin/cmake3 -E cmake_link_script CMakeFiles/Shannon_RNASeq_Cpp.dir/link.txt --verbose=1

它指的是 link.txt 中的内容,这是我在那里找到的内容:

/home/lambda/mylibs/bin/c++  -g  -rdynamic CMakeFiles/Shannon_RNASeq_Cpp.dir/src/main.cpp.o 
CMakeFiles/Shannon_RNASeq_Cpp.dir/src/run_tasks.cpp.o -o
Shannon_RNASeq_Cpp lib_shannon/libmulti_graph_handler.a
lib_shannon/libcontig_graph_handler.a lib_shannon/libprimary_lib.a
-lboost_program_options lib_shannon/libsparse_flow_handler.a
-lglpk lib_shannon/libseq_graph_handler.a -lpthread
-lboost_system -Wl,-Bstatic -lmetis -Wl,-Bdynamic -lboost_filesystem
-lboost_program_options

是的,Boost program_options 已被链接 (-lboost_program_options)。我想知道这是不是program_options有问题,因为这个阶段发生的所有错误都来自program_options;我还链接到其他 2 个 Boost 编译库,即文件系统和系统,它们没有出现在我在这里看到的任何错误消息中。

我自己解决了这个问题(见下面我的回答),但是 CMake 的新手(我对 C++ 的唯一经验是 Rcpp),我不知道它为什么会起作用。有人可以解释为什么切换到静态库有效吗?此外,当 CMake 链接到服务器上默认版本的 Boost 时,它也默认使用 .so 而不是 .a,即使 .a 可用。有没有办法告诉 CMake 使用 .a 而不是 .so?还有其他解决方案吗?

最佳答案

我所做的是将 CMakeCache.txt 中的所有 .so 更改为 .a,就像我更改 libboost_program_options.solibboost_program_options.a,这个错误就消失了。然后来自 make VERBOSE=1 的命令变为:

/home/lambda/mylibs/bin/c++  -g  -rdynamic CMakeFiles/Shannon_RNASeq_Cpp.dir/src/main.cpp.o 
CMakeFiles/Shannon_RNASeq_Cpp.dir/src/run_tasks.cpp.o
-o Shannon_RNASeq_Cpp lib_shannon/libmulti_graph_handler.a
lib_shannon/libcontig_graph_handler.a lib_shannon/libprimary_lib.a
-Wl,-Bstatic -lboost_program_options lib_shannon/libsparse_flow_handler.a
-Wl,-Bdynamic -lglpk lib_shannon/libseq_graph_handler.a -lpthread
-Wl,-Bstatic -lboost_system -lmetis -lboost_filesystem -lboost_program_options -Wl,-Bdynamic

关于c++ - boost program_options 中的链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51958668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com