компоновщик говорит мне, что не может разрешить символы, но они есть?

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

У меня есть 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*, ...)'

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

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 работает с другим, использующим некоторые из тех же символов.

EDIT/ANSWER: Порядок объектов важен. Размещение main.o перед библиотеками было необходимо. Я предполагаю, что компоновщик не имел дела с неразрешенными символами, пока не добрался до main.o - который был последним объектом в его списке. Я все еще немного не понимаю, почему это работало на других машинах в течение многих месяцев...

6
задан Community 23 May 2017 в 11:58
поделиться