'undefined reference to YAML::LoadFile
I'm trying to use the new version of libyaml-cpp and having linker problems (undefined reference to 'YAML::LoadFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)').
I build the library as follows:
cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install
Then I include yaml-cpp/yaml.h and call YAML::LoadFile( some_string );. My compilation line is:
g++ -L/usr/local/lib -I/usr/local/include -lyaml-cpp -std=c++0x -o $@ $^
I've tried putting the exact .so file in there as well with no luck. Using nm I can see a LoadFile function in the shared library. I can't figure out now if I'm somehow using the wrong build line or there is something wrong with the library.
Solution 1:[1]
Support new 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})
Solution 2:[2]
I fixed the issue by adjusting my CMakeList.txt
I had no issues building like stated above:
g++ -L/usr/local/lib -I/usr/local/include -std=c++0x main.cpp -lyaml-cpp
But using cmake and building via CLion failed for me.
This CMakeList.txt fixed it for me (this is just a minimal stripped down Version, but it should give an idea). It assumes there is only one version of yaml-cpp installed on your system:
# 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})
This was the most minimalistic way of getting things to work. I was inspired by SinaĆ Aranda above.
Solution 3:[3]
Do you have the old version of the library installed too? It's possible that gcc is looking for that version first, and doesn't consider the new one.
Solution 4:[4]
I have been struggling over this for the whole evening today. As I found no useful info anywhere in the internet, I post my results here:
Using OSX El Capitan with new versions of XCode (7.3) and CLang (Apple LLVM version 7.3.0 (clang-703.0.29) Using yaml-cpp 0.5.3
Things I did to make it work:
- Obtain FindYamlCpp.cmake from the internet. Save it in /usr/local/share/cmake/Modules
Set CMakeFiles.txt to find 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)Add code to src/CmakeFiles.txt to use FindYamlCpp
# Enable Yaml IF(YAMLCPP_FOUND) ADD_EXECUTABLE(my_exec my_source.cpp) ENDIF(YAMLCPP_FOUND)Using for example ccmake:
- set CMAKE_MODULE_PATH to /usr/local/share/cmake/Modules
- Set CMAKE_EXEC_LINKER_FLAGS to -lyaml-cpp
Solution 5:[5]
I have solved this problem, here is my method:
You may have multiple yaml-cpp libs on your system PATH, perhaps /usr/lib and /usr/local/lib, so the project may link the wrong one.
However, it's difficult to clean up the yaml-cpp libs on your system, so you need to relocate your yaml-cpp lib install path.
try:
clone the source code
cmake -DCMAKE_INSTALL_PREFIX='your_own_path' ..
In your CMakeLists:
find_path(yaml-cpp REQUIRED PATHS your_own_path)
target_include_directories(${PROJECT_NAME} PRIVATE ${YAML_CPP_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} PRIVATE ${YAML_CPP_LIBRARIES})
Hope it can help you, at least it did to me.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | DrGodCarl |
| Solution 2 | LeTigre |
| Solution 3 | Jesse Beder |
| Solution 4 | |
| Solution 5 | D_Latch |
