Gcc 对YAML::LoadFile的未定义引用
我正在尝试使用新版本的libyaml cpp,但链接器出现问题(Gcc 对YAML::LoadFile的未定义引用,gcc,yaml-cpp,Gcc,Yaml Cpp,我正在尝试使用新版本的libyaml cpp,但链接器出现问题(未定义对'YAML::LoadFile(std::basic_string const&')的引用。) 我按如下方式构建库: cmake -DBUILD_SHARED_LIBS=ON .. make sudo make install 然后我包括yaml-cpp/yaml.h并调用yaml::LoadFile(一些字符串)。我的汇编行是: g++ -L/usr/local/lib -I/usr/local/include -lya
未定义对'YAML::LoadFile(std::basic_string const&')的引用。
)
我按如下方式构建库:
cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install
然后我包括yaml-cpp/yaml.h
并调用yaml::LoadFile(一些字符串)代码>。我的汇编行是:
g++ -L/usr/local/lib -I/usr/local/include -lyaml-cpp -std=c++0x -o $@ $^
我试着把确切的。所以
文件也放在那里,但运气不好。使用nm
我可以在共享库中看到LoadFile
函数。我现在无法确定我是否使用了错误的生成行,或者库有问题。您是否也安装了旧版本的库?GCC可能首先寻找这个版本,而不考虑新版本。 < P>这是命令行上的排序问题。我想我永远不会理解GCC命令行逻辑。简单地将库放在末尾似乎是可行的:
g++ -L/usr/local/lib -I/usr/local/include -std=c++0x -o $@ $^ -lyaml-cpp
今天整个晚上我都在为这件事苦苦挣扎。由于我在互联网上的任何地方都找不到有用的信息,我将结果发布在这里:
将OSX El Capitan与新版本的XCode(7.3)和CLang(Apple LLVM版本7.3.0(CLang-703.0.29)结合使用
使用yaml cpp 0.5.3
我所做的事情使它工作:
从获取FindYamlCpp.cmake。将其保存在/usr/local/share/cmake/Modules中
设置cmakfiles.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/cmakfiles.txt以使用FindYamlCpp
# Enable Yaml
IF(YAMLCPP_FOUND)
ADD_EXECUTABLE(my_exec my_source.cpp)
ENDIF(YAMLCPP_FOUND)
例如,使用ccmake:
将CMAKE\u模块路径设置为/usr/local/share/CMAKE/Modules
将CMAKE_EXEC_LINKER_标志设置为-lyaml cpp
支持新的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})
我通过调整我的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})
这是最简单的工作方式。我从上面得到了灵感。是的,我也有旧的,但无法移除(其他一些东西需要它)。这就是为什么我认为放置一个显式路径和/或库名会首先加载新的路径和/或库名。它确实找到了。如果我放置-l:libyaml cpp.so.0.5
is,它不会抱怨缺少文件,但仍然找不到引用。您能解释一下这些步骤的功能/目标是什么,以便人们更容易地使用它吗受得了吗?