yaml-cpp编译报错:undefined reference to YAML::LoadFile 求助
解决yaml-cpp链接时的undefined reference错误
我来帮你排查这个链接错误,你遇到的问题是链接器找不到YAML::LoadFile的符号,结合你的环境和操作,下面是几个针对性的排查和解决步骤:
1. 调整编译命令的参数顺序(关键!)
g++的链接规则是依赖库必须放在源文件/目标文件的后面,你的原命令把-lyaml-cpp放在了main.cpp前面,这会导致链接器先处理库,还没看到需要依赖它的main.cpp,从而跳过符号解析。请改成这个顺序:
g++ main.cpp -std=c++11 -I$(HOME)/local/yaml-cpp/include -L$(HOME)/local/yaml-cpp/build -lyaml-cpp
虽然你说调整过顺序,但再确认下是不是严格按照「源文件 → 编译选项 → 头文件路径 → 库路径 → 库名」的顺序来的。
2. 验证yaml-cpp库是否包含目标符号
先确认你编译出来的共享库确实有LoadFile的对应符号,执行以下命令:
nm -D $(HOME)/local/yaml-cpp/build/libyaml-cpp.so | grep "LoadFile"
如果输出里能看到类似YAML::LoadFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)的符号,说明库没问题;如果没有,那是yaml-cpp编译过程出了问题,需要重新编译:
- 进入yaml-cpp的build目录,清理之前的编译产物:
make clean && rm -rf ./* - 重新执行cmake,明确指定C++11标准和共享库编译:
cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_CXX_STANDARD=11 .. make -j$(nproc)
3. 统一C++ ABI版本
g++ 5.4.0引入了C++11新ABI(使用__cxx11命名空间),如果yaml-cpp编译时用了旧ABI,就会出现符号不匹配的问题。你可以在编译测试程序时强制指定新ABI:
g++ main.cpp -std=c++11 -D_GLIBCXX_USE_CXX11_ABI=1 -I$(HOME)/local/yaml-cpp/include -L$(HOME)/local/yaml-cpp/build -lyaml-cpp
如果还是不行,就重新编译yaml-cpp时也指定这个ABI:
cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_CXX_STANDARD=11 -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=1" .. make -j$(nproc)
4. 确认库路径和文件存在
最后再检查一下:
$(HOME)/local/yaml-cpp/build下是否有libyaml-cpp.so文件?- 头文件路径
$(HOME)/local/yaml-cpp/include/yaml-cpp/yaml.h是否存在?
如果以上步骤都试过还是不行,可以把nm命令的输出贴出来,方便进一步排查。
内容的提问来源于stack exchange,提问作者Ben Lindsay
相关产品推荐
相关产品推荐

