2017-01-11 6 views
0

Я пытаюсь связать с 3-сторонней библиотеки в Linux с помощью г ++ моя команда г ++ являетсяг ++ компоновщик неопределенная ссылка только некоторые функции (не все) из общей библиотеки

g++ -o "outdir/libmyLib.so.1.0" -Wl,--trace-symbol=_foo_bar_baz -Wl,--no-undefined -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -shared -Wl,--verbose obj_a.o obj_b.o foobarwrapper.o -L/usr/local/lib/foobar `pkg-config --libs gtk+-3.0` -Wl,--start-group -llots -lof -ldeps -lfoobar -lz -ldl -lm -Wl,--end-group 

это дает неопределенную ссылку из линкер

GNU ld (GNU Binutils for Ubuntu) 2.26.1 
1>  Supported emulations: 
1>  elf_x86_64 
1>  elf32_x86_64 
1>  elf_i386 
1>  elf_iamcu 
1>  i386linux 
1>  elf_l1om 
1>  elf_k1om 
1>  i386pep 
1>  i386pe 
1> using internal linker script: 
1> ================================================== 
1> /* Script for --shared -z combreloc -z now -z relro: shared library, combine & sort relocs */ 
1> 
1> attempt to open /usr/local/lib/foobar/libfoobar.so succeeded 
1> /usr/local/lib/foobar/libfoobar.so: definition of _foo_bar_baz 
1> /obj/x64/Debug/foobarwrapper.o: In function `foobarwrapper::ThreadEntryRoutine()': 
1> /foobarwrapper.cpp:479: undefined reference to `_foo_bar_baz()' 
1> collect2: error: ld returned 1 exit status 

В общей сложности есть около 30 функций, которые я использую из этой библиотеки, но только 4 из функций генерировать ошибку компоновщика.

Я попытался переместить -lfoobar в разные места. Это либо не имеет никакого значения, либо все функции библиотеки не могут быть связаны.

Я попытался добавить -lfoobar в команду компиляции в соответствии с некоторыми ответами/комментариями к подобным вопросам, но до сих пор не люблю.

Что я здесь делаю неправильно?

+0

Вы можете попробовать проверить экспортированные символы, например. 'nm -D C -g libname.so', чтобы узнать, в чем отличия. – axalis

+0

@axalis nm перечисляет их все как «T» – jhbh

+0

И есть ли все имена неудачных функций? Это было бы странно. Повторно проверьте также поиск (например, «труба» на «меньше» и попытайтесь найти конкретные имена функций) – axalis

ответ

0

обертывание #includes заголовков для библиотеки с extern «C» {}, похоже, сделал бизнес.