【问题标题】:Undefined reference issue while creating executable创建可执行文件时未定义的引用问题
【发布时间】:2018-05-11 13:27:48
【问题描述】:

我正在尝试使用一些库创建可执行文件。 我的 GCC 命令是:-

gcc -fPIC -DLINUX testdenpli /verilog/libdenpli.so -L/local/test/dir/ testpli.c 

我的库在路径 '/local/test/dir/' 中有符号

Error:-
libdenpli.so: undefined reference to `ktlTcl_InitStubs'
libdenpli.so: undefined reference to `ktlitclStubsPtr'

我在路径“'/local/test/dir/”中有带有上述符号的库..但仍然看到问题。

请任何人帮忙。

【问题讨论】:

  • Verilog 是否有关于您需要安装的必备库以及正确的编译/链接配置需要的说明?
  • @lurker,没有得到你...你能详细说明一下吗?
  • libdenpli.so 需要链接另一个提供这些未定义符号的库。检查文档。
  • @MaximEgorushkin ,你的意思是它有一些依赖关系?如何检查依赖'libdenpli.so'库的库是什么?
  • 这个库必须附带说明如何链接它的文档。

标签: c gcc makefile gnu-make


【解决方案1】:

错误消息说libdenpli.so 需要链接另一个提供符号ktlTcl_InitStubsktlitclStubsPtr 的共享库。

使用以下命令查找提供这些符号的共享库:

for so in $(find /local/test/dir -name "*.so" -o -name "*.so.*"); do
    nm --defined-only --dynamic $so 2>/dev/null | grep -q 'ktlTcl_InitStubs|ktlitclStubsPtr' && echo $so; 
done

然后将该库添加到链接器命令行中:

gcc -Wall -Wextra -fPIC -DLINUX -o testdenpli testpli.c /verilog/libdenpli.so <full-path-to-found-library>

【讨论】:

  • 我没有看到上述命令的任何输出。 'nm' 的 --dynamic 选项是什么?如果我只运行“nm | grep ktlTcl_InitStubs”,我可以看到输出我看到输出:- 0000000000038200 t ktlTcl_InitStubs ...
  • @jerry 检查man nm 是否有--dynamic。如果您没有看到任何输出,那么这些符号可以在 .a 中。
  • 似乎这就是问题所在。库 'libdenpli.so' 的符号为 'ktlTcl_InitStubs ' 和 't' 。仅当符号带有“D”动态时才有效吗?
  • @jerry 符号ktlTcl_InitStubs 未在libdenpli.so 中定义,这就是错误消息的内容。做nm --defined-only libdenpli.so.
  • 是的,当我尝试执行此操作“nm --defined-only libdenpli.so | grep ktlTcl_InitStubs”时,我没有看到任何输出。似乎它是未定义的。马克西姆,我该如何解决这个问题。请帮忙
【解决方案2】:

包含符号的库的名称是什么?您需要在编译中包含 -lNAME。 一般来说,

gcc file.c -o file -L/path/to/libs -lNAME

注意,前缀“lib”和后缀“.so”不必提及。

【讨论】:

  • 不,作者做得对。使用您的命令行,它将链接但不会运行。
  • @MaximEgorushkin 为什么解析符号后它不会运行?我只是指出编译中缺少库的名称。
  • 它不会运行,因为运行时链接器ld.so 不会在非标准位置找到它。这需要-Wl,-rpath=/path/to/libs 命令行选项。如果您只是链接到不需要-L-Wl,-rpath=.../verilog/libdenpli.so
猜你喜欢
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2011-11-14
相关资源
最近更新 更多