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 未定义的 CMake 引用

未定义的参考链接 yaml-cpp 程序与 mingw-w64 + cmake

为 yaml-cpp 库找到正确的 cmake 配置

为 yaml-cpp 库找到正确的 cmake 配置

链接 Yaml-cpp 和 Armadillo 共享库的 CMake 项目

如何在没有 CMake 的情况下构建 yaml-cpp