Неопределенная ссылка, хотя символ присутствует в .so

Отказ от ответственности: мне известны такие вопросы, как это и this, но ничего не помогло мне решить мою проблему.

Я пытаюсь скомпилировать более крупный проект, зависящий от пакета ROOT, и мне удалось воспроизвести ошибку, с которой я столкнулся, в минимальном примере:

test.cpp:

#include "Math/GenVector/GenVector_exception.h"
int main()
{
  ROOT::Math::GenVector::Throw("foo");
}

скомпилировано с: g++ -lGenVector test.cpp дает:

/tmp/ccq9A45m.o: In function `main':
test.cpp:(.text+0xc): undefined reference to `ROOT::Math::GenVector::Throw(char const*)'
collect2: error: ld returned 1 exit status

локализация libGenVector.so с помощью ld --verbose -lGenVector | grep "lib GenVector.so succeeded" дает:

attempt to open //usr/local/lib/libGenVector.so succeeded

проверка, определен ли символ в библиотеке с помощью nm -DgC --defined-only /usr/local/lib/libGenVector.so| grep Throw, дает:

000000000003f180 T ROOT::Math::Throw(ROOT::Math::GenVector_exception&)
000000000003f1e0 T ROOT::Math::GenVector::Throw(char const*)

Основываясь на ответе на этот вопрос, я также попытался для компиляции с -std=c++11 и -std=c++14 и -std=c++17, но все выдает одно и то же сообщение об ошибке.


person Przemysław Czechowski    schedule 01.08.2018    source источник
comment
Порядок имеет значение! Если исходный файл, объектный файл или библиотека A зависят от библиотеки B, то A должно стоять перед B в командной строке.   -  person Some programmer dude    schedule 01.08.2018
comment
о, отлично, и я вижу, что g++ test.cpp -lGenVector работает! спасибо, @Someprogrammerdude, если вы напишете это как ответ, я приму это.   -  person Przemysław Czechowski    schedule 01.08.2018
comment
На практике (не связанной с тем, в чем была проблема) с root я счел более полезным проверять файлы корневой карты перед проверкой содержимого файлов .so для своего рода удобочитаемого поиска, с которым я должен ссылаться, чтобы использовать какой класс ( хотя не поставляется с зависимостями).   -  person pseyfert    schedule 01.08.2018
comment
И для стандартов С++ я бы использовал root-config --cflags, а не угадывал -std=c++1? - я ожидаю, что проблемы возникнут, как только вы создадите проекты в зависимости от корня с другой стандартной версией С++, чем та, с которой был создан один корень.   -  person pseyfert    schedule 01.08.2018