【问题标题】:g++ linker undefined reference to only some functions (not all) from shared libraryg ++链接器未定义仅引用共享库中的某些函数(不是全部)
【发布时间】:2017-05-26 11:00:50
【问题描述】:

我正在尝试使用 g++ 链接到 linux 中的第 3 方库 我的 g++ 命令是

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 移动到不同的地方。它要么没有区别,要么所有库函数都无法链接。

我已经尝试根据类似问题的一些答案/cmets 将 -lfoobar 添加到编译命令中,但仍然没有爱。

我在这里做错了什么?

【问题讨论】:

  • 您可以尝试检查导出的符号,例如nm -D C -g libname.so 看看有什么区别。
  • @axalis nm 将它们全部列为“T”
  • 所有失败的函数名称都在那里?那会很奇怪。也可以通过搜索重新检查(例如通过管道连接到less 并尝试搜索特定的函数名称)
  • @axalis 他们都在场并被考虑在内。将 nm 输出通过管道传输到 grep 并通过 ida 运行。 ida 显示函数已导出并具有可执行代码。我本来打算比较有问题的 linux 和工作 windows 库的程序集,以确保提供者没有搞砸什么,但我偶然抓住了一个过时版本的 windows lib,所以如果问题仍然存在,我将不得不在下班后这样做已解决。

标签: c++ c++11 linker g++


【解决方案1】:

用 extern "C" {} 包装 lib 标头的#includes 似乎已经完成了这项工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2013-06-21
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多