C 创建可执行文件时出现未定义的引用问题

C 创建可执行文件时出现未定义的引用问题,c,gcc,makefile,gnu-make,C,Gcc,Makefile,Gnu Make,我正在尝试使用一些库创建可执行文件。 我的命令是:- 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 `ktlitclStu

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

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/”处有带有上述符号的库。。但仍然看到了这个问题


任何人请帮忙。

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

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


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

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

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

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>
gcc-Wall-Wextra-fPIC-DLINUX-o testdenpli testpli.c/verilog/libdenpli.so

Verilog是否有关于您需要安装的必备库以及正确的编译/链接配置的说明?@Louger,不明白您的意思……请详细说明一下?
libdenpli。因此
需要链接另一个提供这些未定义符号的库。检查文档。@MaximeGroushkin,你是说它有一些依赖项?如何检查哪些库依赖于“libdenpli.so”库?此库必须附带说明如何与之链接的文档。不,作者做得对。使用您的命令行,它将链接但不会运行。@MaximeGroushkin为什么在符号解析后它不会运行?我只是指出编译中缺少库的名称。它不会运行,因为运行时链接器
ld。因此
不会在非标准位置找到它。这需要
-Wl,-rpath=/path/to/libs
命令行选项。如果您只是针对
/verilog/libdenpli.so
进行链接,则不需要
-L
-Wl,-rpath=…
。我没有看到上述命令的任何输出。这是什么?“nm”的动态选项?如果我只使用“nm | grep ktlTcl _InitStubs”运行,我可以看到输出:-00000000000 38200 t ktlTcl _InitStubs…@jerry Check
man nm
for
--dynamic
。如果看不到任何输出,则这些符号可能在a
中。a
似乎就是问题所在。。库'libdenpli.so'具有符号'ktlTcl_InitStubs'和't'。只有当符号带有“D”dynamic时,它才会工作吗?@jerry symbol
ktlTcl_InitStubs
libdenpli.so
中没有定义,这就是错误消息所说的。Do
nm——仅定义libdenpli.so
。是的,当我尝试执行此操作“nm——仅定义libdenpli.so | grep ktlTcl_InitStubs”时,我没有看到任何输出。似乎还没有定义。马克西姆,我如何解决这个问题。请帮忙