系统信息: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的锅!!! 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的锅 害我找那么久