我正在尝试使用新版本的libyaml-cpp并遇到链接器问题(undefined reference to 'YAML::LoadFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
)。
我按如下方式构建库:
cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install
然后我加入yaml-cpp/yaml.h
并致电YAML::LoadFile( some_string );
。我的编译行是:
g++ -L/usr/local/lib -I/usr/local/include -lyaml-cpp -std=c++0x -o $@ $^
我已经尝试将确切的.so
文件放在那里,但没有运气。使用nm
我可以在共享库中看到LoadFile
函数。如果我以某种方式使用错误的构建行或者库存在问题,我现在无法弄清楚。
答案 0 :(得分:6)
这是命令行上的排序问题。我想我永远不会理解GCC命令行逻辑。简单地将库放在最后似乎有效:
g++ -L/usr/local/lib -I/usr/local/include -std=c++0x -o $@ $^ -lyaml-cpp
答案 1 :(得分:0)
您是否也安装了旧版本的库? gcc可能首先寻找该版本,而不考虑新版本。
答案 2 :(得分:0)
今天整个晚上,我一直在努力。由于我在互联网上找不到任何有用的信息,我在这里发布我的结果:
使用OSX El Capitan和新版本的XCode(7.3)和CLang(Apple LLVM版本7.3.0(clang-703.0.29)) 使用yaml-cpp 0.5.3
我为使其发挥作用所做的事情:
设置CMakeFiles.txt以查找Yaml-cpp
# YAML with yaml-cpp
SET(YAMLCPP_STATIC_LIBRARY TRUE)
FIND_PACKAGE(YamlCpp)
IF(YamlCpp_FOUND)
MESSAGE("yaml-cpp Library FOUND: yaml-cpp related sources will be built.")
ELSEIF(YamlCpp_FOUND)
MESSAGE("yaml-cpp Library NOT FOUND!")
ENDIF(YamlCpp_FOUND)
将代码添加到src / CmakeFiles.txt以使用FindYamlCpp
# Enable Yaml
IF(YAMLCPP_FOUND)
ADD_EXECUTABLE(my_exec my_source.cpp)
ENDIF(YAMLCPP_FOUND)
使用例如ccmake:
答案 3 :(得分:0)
支持新的yaml-cpp API。
find_package(PkgConfig)
pkg_check_modules(YAMLCPP REQUIRED yaml-cpp>=0.5)
include_directories(${YAMLCPP_INCLUDE_DIRS})
add_executable(name src/name.cpp)
target_link_libraries(name ${catkin_LIBRARIES} ${YAMLCPP_LIBRARIES})
答案 4 :(得分:0)
我通过调整CMakeList.txt
我没有出现如上所述的问题:
g++ -L/usr/local/lib -I/usr/local/include -std=c++0x main.cpp -lyaml-cpp
但是使用cmake和通过CLion进行构建对我来说是失败的。
此CMakeList.txt
为我修复了此问题(这只是精简的最低版本,但应该给出一个主意)。假定系统上仅安装了一个版本的yaml-cpp:
# Projekt Description / etc
cmake_minimum_required(VERSION 3.14)
project(yaml_cpp)
set(CMAKE_CXX_STANDARD 14)
# Declaration of package required
find_package(PkgConfig)
pkg_check_modules(YAMLCPP REQUIRED yaml-cpp>=0.5)
# Define the executable and link the yaml libs
add_executable(yaml_cpp main.cpp)
target_link_libraries(yaml_cpp ${YAMLCPP_LIBRARIES})
这是使事情正常运行的最简单方法。上面的Sinaí Aranda启发了我。