CMake - 静态 yaml-cpp 作为 git 子模块的链接器错误
CMake - Linker error with static yaml-cpp as git submodule
我正在尝试在我的项目中使用 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 构建的。
谢谢!
好吧,我累了...
mongodb 已经在我的电脑上安装了 yaml-cpp。我将 mongodb 中的头文件与我刚刚从源代码编译的静态库一起使用...头文件使用 boost::shared_ptr
调用函数,而我的库是使用 std::shared_ptr
[=12 实现的=]
我正在尝试在我的项目中使用 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 构建的。
谢谢!
好吧,我累了...
mongodb 已经在我的电脑上安装了 yaml-cpp。我将 mongodb 中的头文件与我刚刚从源代码编译的静态库一起使用...头文件使用 boost::shared_ptr
调用函数,而我的库是使用 std::shared_ptr
[=12 实现的=]