CMake - 静态 yaml-cpp 作为 git 子模块的链接器错误
Posted
技术标签:
【中文标题】CMake - 静态 yaml-cpp 作为 git 子模块的链接器错误【英文标题】:CMake - Linker error with static yaml-cpp as git submodule 【发布时间】:2017-12-30 16:12:31 【问题描述】:我正在尝试在我的项目中使用yaml-cpp。我正在使用 cmake 来构建我的项目和 yaml-cpp,它是我项目中的一个 git 子模块。
我的电脑上有 boost 库(yaml-cpp 需要)。
我正在静态构建它。在我的主 CMakeLists.txt 中使用 add_subdirectory
,然后使用 target_link_libraries(components yaml-cpp)
(component 是我在项目的不同模块上使用的静态库)。
在我的一个源文件的链接阶段出现错误:
CMakeFiles/rsa-packer.dir/options/addObject.cpp.o : In function « YAML::detail::node& YAML::detail::node_data::get<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::shared_ptr<YAML::detail::memory_holder>) » :
~/git/apps/rsa-packer/options/addObject.cpp:(.text._ZN4YAML6detail9node_data3getINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE[_ZN4YAML6detail9node_data3getINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE]+0x157) : undefined reference to: « YAML::detail::node_data::convert_to_map(boost::shared_ptr<YAML::detail::memory_holder>) »
我检查了 make 输出,有 -lyaml-cpp 选项。 我检查了 libyaml-cpp.a 文件,它包含函数(但我不太了解 nm 的输出:
000000000000005d r .L__PRETTY_FUNCTION__._ZN4YAML6detail9node_data14convert_to_mapESt10shared_ptrINS0_13memory_holderEE
0000000000000940 T _ZN4YAML6detail9node_data14convert_to_mapESt10shared_ptrINS0_13memory_holderEE
奇怪的是:
// this works
YAML::Node node = YAML::Load(manifest.getStream());
// this does not work
if(node["objects"])
std::cout << "no objects" << std::endl;
我可以使用 YAML::Load
函数构建节点对象,该函数可以在静态库中找到。
但我无法调用node["..."]
,因为在库中找不到该函数。
我不知道是什么导致了这个错误。
我不知道它是否会导致问题,但我正在用 C++14 编译我的项目,并且 yaml-cpp 库是使用 c++11 构建的。
谢谢!
【问题讨论】:
【参考方案1】:好吧,我累了……
mongodb 已经在我的电脑上安装了 yaml-cpp。我正在使用来自 mongodb 的头文件和我刚刚从源代码编译的静态库...头文件正在使用 boost::shared_ptr
调用函数,而我的库是使用 std::shared_ptr
实现的
【讨论】:
以上是关于CMake - 静态 yaml-cpp 作为 git 子模块的链接器错误的主要内容,如果未能解决你的问题,请参考以下文章
未定义的参考链接 yaml-cpp 程序与 mingw-w64 + cmake