Ошибка компиляции yaml-cpp: «неопределенная ссылка на YAML :: LoadFile» - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь запустить простую тестовую программу с yaml-cpp, которая выглядит следующим образом:

// main.cpp

#include <iostream>
#include "yaml-cpp/yaml.h"

int main(int argc, const char *argv[])
{
     YAML::Node config = YAML::LoadFile("config.yaml");
     std::cout << config << std::endl;
}

Я пытаюсь скомпилировать эту команду:

g++ -lyaml-cpp -L$(HOME)/local/yaml-cpp/build -I$(HOME)/local/yaml-cpp/include -std=c++11 main.cpp

и я получаю сообщение об ошибке, похожее на это:

/tmp/ccz0D5ol.o: In function `main':
main.cpp:(.text+0xdd): undefined reference to `YAML::LoadFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2: error: ld returned 1 exit status
make: *** [all] Error 1

Вот g ++, который я использую:

$ g++ --version
g++ (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Это на машине с Linux, где я нене имеет root-доступа.Я клонировал git-репозиторий на $HOME/local/yaml-cpp, создал каталог сборки, запустил cmake -DBUILD_SHARED_LIBS=ON .., затем make, который создал файл libyaml-cpp.so.0.6.2 и символические ссылки libyaml-cpp.so.0.6 и libyaml-cpp.so.Мой cmake - это версия 3.11.2, если это имеет значение.

Не уверен, что это полезно, но я сначала запустил эту проблему сопровождающим yaml-cpp как проблема github , и онсказал

Вероятно, ошибка конфигурации;Вы могли бы получить ответ, если спросите о переполнении стека.

Я также нашел похожий вопрос с почти такой же проблемой, но ее решение реорганизациипорядок команды компиляции не работал для меня.Я получаю ту же проблему, независимо от того, находится -lyaml-cpp в начале или в конце команды.

Любая помощь будет принята.

1 Ответ

0 голосов
/ 26 мая 2018

@ VTT был прав, указав мне на cmake и компилятор.Когда я посмотрел на результаты исходной команды cmake, первые две строки сказали:

-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5

Хотя which gcc и which g++ указывают на версию 5.4.0.Я нашел этот SO-ответ , который указывает на эту страницу часто задаваемых вопросов cmake о том, что вам нужно установить переменные окружения CC и CXX, чтобы указать другой компилятор.Поэтому я изменил свою команду cmake следующим образом:

CC=$(which gcc) CXX=$(which g++) cmake -DBUILD_SHARED_LIBS=ON ..

и теперь все отлично работает.

...