升压program_options中的链接错误
Linking error in boost program_options
我正在尝试从源代码构建第三方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 程序选项链接错误(,最初认为这是由用于构建 Boost 的非标头部分的不同编译器引起的,所以我下载了 Boost 1.68.0 的源代码并使用我用于构建第三方库的相同编译器(编译器是 gcc 8.2.0(在我的个人目录中构建它, 从错误消息中,我可以判断使用了 C++11 标准(您可以在错误消息中看到cxx11
(,因此不可能是不支持 C++11 的编译器导致麻烦,如前所述(例如,在 xubuntu 中未定义对 boost::p rogram_options 的引用(。为了使用自定义编译器构建 Boost(服务器的默认编译器已经过时了(,我按照此处的说明进行操作。
进一步的搜索显示这是一个链接问题。第三方库必须由 CMake 构建,我按照回答上一个问题(如何使用 CMake 将程序与 Boost 链接C++的说明进行操作,方法是将这一行添加到第 3 方库的根目录中的CMakeLists.txt
:
target_link_libraries(Shannon_RNASeq_Cpp ${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE})
但是,同样的问题仍然存在。我检查了文件CMakeCache.txt
,并确认使用了所需的编译器,Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE
指向我放置 Boost 1.68.0 的目录中的libboost_program_options.so
(服务器有其他旧版本的 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 版本时,即使.a
可用,它也默认使用.so
而不是.a
s。有没有办法告诉CMake使用.a
而不是.so
s?还有其他解决方案吗?
我所做的是将CMakeCache.txt
中的所有.so
s更改为.a
s,就像我将libboost_program_options.so
更改为libboost_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
- 静态数据成员的问题-修复链接错误会导致编译器错误
- Visual Studio mkl_link_tool.exe链接错误
- C++ 实现模板单例类时出现链接错误
- 使用类模板的方法链接错误
- MySQL C++连接器链接错误
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 运行 C++ 单元测试时LNK2005链接错误
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 链接错误,包括我创建的相同头文件 - C++
- 在Embarcadero C++ Builder中生成的DLL未解决的外部链接错误
- 使用标头保护的多个定义链接错误
- 链接错误:未定义对 stdscr 和 wgetch 的引用
- 使用 Vivek 的 Vcam / 捕获源过滤器构建/链接错误
- 升压program_options中的链接错误
- 使用 g++ 预处理器进行替换会导致链接错误
- 在调试配置中编译工作正常,但发布会给出链接错误
- 相邻矩阵设置链接错误
- 包含常量变量并包含在多个文件中的标头的链接错误
- C++链接错误,我理解但无法解决
- 是什么导致macOS Mojave上的GoogleTest链接错误