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.
It's an ordering problem on the command-line. I guess I'll just never understand GCC command-line logic. Simply putting the library at the end seems to work:
g++ -L/usr/local/lib -I/usr/local/include -std=c++0x -o $@ $^ -lyaml-cpp
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})
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.
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
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.