компоновщик говорит мне, что не может разрешать символы, но они есть? - PullRequest
5 голосов
/ 05 декабря 2011

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

У меня есть libroller.so, доступный в / usr / lib. Я собираю main.cpp как так:

g++ -g3 -Wall -I"../../" -lrt -lroller -o rap main.o

Он жалуется на многочисленные ошибки, такие как:

/....../main.cpp:51: undefined reference to `Log::i(char const*, ...)'

Однако я знаю, что они существуют в этом, так:

nm -Ca /usr/lib/libroller.so | grep "Log::i"            
00000000001f5d50 T Log::i(char const*, ...)
0000000000149530 W Log::i(std::string const&)

Оба являются 64-битными:

file /usr/lib/libroller.so           
/usr/lib/libroller.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped

file main.o   
main.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

В отличие от GCC и ld не могут найти экспортированные символы ... но они есть! Я почти уверен, что эти символы определены. То же самое .so работает с другим, используя одни и те же символы.

РЕДАКТИРОВАТЬ / ОТВЕТ: порядок объектов важен. Размещение main.o перед библиотеками было необходимо. Я предполагаю, что у компоновщика не было неразрешенных символов, чтобы иметь дело с ним, пока он не добрался до main.o - который был последним объектом в его списке. Я все еще немного озадачен тем, почему это работало на других машинах в течение многих месяцев ...

Ответы [ 3 ]

3 голосов
/ 05 декабря 2011

Изменение:

g++ -g3 -Wall -I"../../" -lrt -lroller -o rap main.o

на:

g++ -g3 -Wall main.o -lroller -lrt -o rap 

Порядок ссылок имеет значение (и -I является избыточным в этом случае).

1 голос
/ 05 декабря 2011

Ваш вопрос является дубликатом этого и имеет тот же ответ: порядок библиотек в строке ссылки имеет значение .

1 голос
/ 05 декабря 2011

Рассмотрите возможность изменения последовательности библиотеки и main.o:

g++ -g3 -Wall -I"../../" -o rap main.o -lrt -lroller

Посмотрите на этот пост: Почему порядок, в котором связаны библиотеки, иногда вызываетошибки в GCC?

...