未定义对 YAML::LoadFile 的引用
Posted
技术标签:
【中文标题】未定义对 YAML::LoadFile 的引用【英文标题】:undefined reference to YAML::LoadFile 【发布时间】:2014-03-03 05:16:12 【问题描述】:我正在尝试使用新版本的 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
函数。我现在不知道是我以某种方式使用了错误的构建线还是库有问题。
【问题讨论】:
【参考方案1】:这是命令行上的排序问题。我想我永远不会理解 GCC 命令行逻辑。简单地将库放在最后似乎可行:
g++ -L/usr/local/lib -I/usr/local/include -std=c++0x -o $@ $^ -lyaml-cpp
【讨论】:
【参考方案2】:支持新的 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)
【讨论】:
你能解释一下这些步骤的功能/目标是什么,以便人们更容易理解它吗?【参考方案3】:我通过调整我的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 的启发。
【讨论】:
【参考方案4】:你也安装了旧版本的库吗?可能 gcc 会先寻找那个版本,而不考虑新版本。
【讨论】:
是的,我也有旧的,但无法删除它(其他一些东西需要它)。这就是为什么我虽然放置一个明确的路径和/或库名称会首先加载新的。 它确实找到了它。如果我输入-l:libyaml-cpp.so.0.5
不会抱怨缺少文件,但仍然找不到参考。【参考方案5】:
我今天整个晚上都在为此苦苦挣扎。由于我在互联网上的任何地方都找不到有用的信息,所以我在这里发布了我的结果:
将 OSX El Capitan 与新版本的 XCode (7.3) 和 CLang(Apple LLVM 版本 7.3.0 (clang-703.0.29) 使用 yaml-cpp 0.5.3
我为使它工作所做的事情:
-
从internet 获取 FindYamlCpp.cmake。将其保存在 /usr/local/share/cmake/Modules 中
设置 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:
-
将 CMAKE_MODULE_PATH 设置为 /usr/local/share/cmake/Modules
将 CMAKE_EXEC_LINKER_FLAGS 设置为 -lyaml-cpp
【讨论】:
以上是关于未定义对 YAML::LoadFile 的引用的主要内容,如果未能解决你的问题,请参考以下文章