当前位置: 首页 > 工具软件 > yaml-cpp > 使用案例 >

随手记录: yaml-cpp 库使用与编译问题 undefined reference to **

班宏毅
2023-12-01

系统信息:Ubuntu 20.04, yaml-cpp 0.7.0, gcc version 9.4.0, CMake 编译

问题示意:

要么是编译报错:

/usr/bin/ld: CMakeFiles/test_yaml.dir/test/read_yaml.cpp.o: in function `main':
/home/kin/workspace/EDOMap/test/read_yaml.cpp:14: undefined reference to `YAML::LoadFile(std::string const&)'
/usr/bin/ld: CMakeFiles/test_yaml.dir/test/read_yaml.cpp.o: in function `YAML::detail::node_ref::set_scalar(std::string const&)':
/usr/local/include/yaml-cpp/node/detail/node_ref.h:37: undefined reference to `YAML::detail::node_data::set_scalar(std::string const&)'
/usr/bin/ld: CMakeFiles/test_yaml.dir/test/read_yaml.cpp.o: in function `YAML::Node::Scalar() const':
/usr/local/include/yaml-cpp/node/impl.h:169: undefined reference to `YAML::detail::node_data::empty_scalar()'
/usr/bin/ld: CMakeFiles/test_yaml.dir/test/read_yaml.cpp.o: in function `YAML::detail::node& YAML::detail::node_data::get<char [4]>(char const (&) [4], std::shared_ptr<YAML::detail::memory_holder>)':

要么编译过,运行 segmentation fault

segmentation fault

简要版解决方案, 参考issue comment 在.cpp里面顶上加一个这个:

#define YAML_CPP_STATIC_DEFINE

或者 Open3D原因,重新编译一下 详情见第二部分

可能原因 [静态编译]

编译报错的原因,其实是因为我的另一个程序子库是用的gcc 10.0+编译的,所以正常我的编译指令是:

mkdir build && cd build
cmake .. -D CMAKE_CXX_COMPILER=g++-10 && make

文件结构:

➜  test_ws tree -L 2    
.
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   ├── Makefile
│   └── test_yaml
├── CMakeLists.txt
└── test.cpp

然后main.cpp文件长这样:

// STL
#include <iostream>

#include <glog/logging.h>
#include "yaml-cpp/yaml.h"

int main(int argc, char* argv[]){
    // Setup logging.
	google::InitGoogleLogging(argv[0]);
	google::InstallFailureSignalHandler();
	FLAGS_colorlogtostderr = true;
	google::SetStderrLogging(google::INFO);

    // YAML::Node node = YAML::LoadFile("assets/config.yaml");
    YAML::Node node = YAML::Load("foo: bar\nx: 2");
	// for(auto dict: config){
	// std::string test_path = config["point_cloud_data_dir"].as<std::string>();
	LOG(INFO) << node["foo"].as<std::string>();
	// auto debug_test = config["debug_print"];
	// LOG(INFO) << test_path;
	// LOG(INFO) << debug_test;
	// }
}

CMakeLists.txt 完整为:

cmake_minimum_required(VERSION 3.14)
project(edomap
	VERSION 1.0.0
	DESCRIPTION "EDOMap"
	LANGUAGES CXX
)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(default_build_type "Release")

include_directories(include)

find_package(Glog REQUIRED)
find_package(gflags REQUIRED)
find_package(Eigen3 REQUIRED)
set(LOG_LIB glog::glog gflags)

# Declaration of package required
find_package(yaml-cpp REQUIRED)

add_executable(test_yaml main.cpp)
target_link_libraries(test_yaml ${LOG_LIB} yaml-cpp)

。。。。 我复现不出来问题了 holl shit… 即使删掉了 他好像也不报错了?? 我他喵??

但是多少还是总结一下:

  • 初步尝试 没有走 cmake .. && make 更高的编译器的话 能编译通过

  • 进步尝试 通过后运行代码 会报segment fault

  • 后面 查了一圈 无果,看到了issue里的static问题,直接加在.cpp的开头

  • 哦吼 然后就好了 就好了 就好了?? -> 甚至 下次想复现出来问题都复现不出来了… 我人… 傻了

但是复现的时候 发现 make install 和之前印象中的不一样是static的自动编译 CXX static library 我记得之前的好像不是

[ 83%] Linking CXX static library libyaml-cpp.a
[ 83%] Built target yaml-cpp
Consolidate compiler generated dependencies of target parse

进一步 [Open3D原因]

最后发现原来是Open3D的锅!!! issue link

但明明最后那个人说 已经是默认选项了… 难道是open3d和yaml-cpp宿怨了?

emmm 我忘了之前我电脑的Open3D是怎么来的了,但是似乎拉取最新的v0.16.0就可了,安装方式如下:

git clone --recursive --depth 1 --branch v0.16.0 https://github.com/isl-org/Open3D
cd Open3D && source util/scripts/install-deps-ubuntu.sh
mkdir build && cd build
cmake -DBUILD_EIGEN3=ON -DBUILD_GLEW=ON -DBUILD_GLFW=ON -DBUILD_JSONCPP=ON -DBUILD_PNG=ON -DGLIBCXX_USE_CXX11_ABI=ON -DPYTHON_EXECUTABLE=/usr/bin/python -DBUILD_UNIT_TESTS=ON ..
make -j${nproc}
sudo make install

好了… 就是Open3D的锅 害我找那么久

 类似资料: