C 如何进行符号的.so文件查找?

C 如何进行符号的.so文件查找?,c,makefile,undefined-symbol,.so,C,Makefile,Undefined Symbol,.so,我有一个.so文件,其中包含一些extern函数声明。 这些函数的定义是二进制的,我是二进制的 链接.so文件。但在链接时,我得到了未定义的引用 错误 是否有任何方法可以在.so的makefile中为符号查找提供一些路径 我使用了objdump在.so(外部声明)和.o(实际定义不同目录)中列出符号,我看到两个地方都有相同的符号 /homes/uakash/cmd/usr/lib64$ objdump -T libcpld-cmd.so.0 | grep Parent ::::: 00000

我有一个.so文件,其中包含一些
extern
函数声明。 这些函数的定义是二进制的,我是二进制的 链接.so文件。但在链接时,我得到了未定义的引用 错误

是否有任何方法可以在.so的makefile中为符号查找提供一些路径

我使用了
objdump
在.so(外部声明)和.o(实际定义不同目录)中列出符号,我看到两个地方都有相同的符号

/homes/uakash/cmd/usr/lib64$ objdump -T libcpld-cmd.so.0 | grep Parent

:::::

0000000000000000      D  *UND*  0000000000000000              _Z29getParentCpldIFDOFromPreviousSt10shared_ptrIN3net74cpld14ParentCpldIFDOEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
::::

/homes/uakash/src/usr/sbin/l$ objdump -t cpld_cmd.o | grep Parent

::::
00000000000000d0 g     F .text  0000000000000600  _Z29getParentCpldIFDOFromPreviousSt10shared_ptrIN3net74cpld14ParentCpldIFDOEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
::::

您似乎对共享库的工作方式有误解。.so文件和.o文件都包含该定义。一个用于动态链接,另一个用于静态链接。您需要使用on或其他,但不能同时使用两者

例如,假设给定您的共享库
libcpld cmd.so
,并且您希望使用source
main.c
将其链接到您的代码,例如,然后:

gcc main.c -lcpld-cmd.so -o myprogram
链接器将处理cpld-cmd.so以解析符号,但不会实际链接其中的目标代码-这将是一个静态链接

然后运行
myprogram
时,库必须可用,操作系统加载程序将在运行时动态链接库代码

参考:

另一方面,如果您希望静态链接,则可以链接
cpld cmd.o
,并且.so文件不起任何作用,也不是必需的-所有代码都静态链接到
myprogram

gcc main.c cpld-cmd.o -o myprogram
我有一个.so文件,其中包含一些外部函数声明。这些函数的定义是在我链接到的一个二进制文件中的.so文件。但在链接时,我得到了未定义的引用错误

然后,您应该使用
-rdynamic
标志(当然还有
-ldl
库提供
dlopen
,如果您使用该标志),链接主程序(正在调用或正在与库链接)


也请阅读德雷珀的论文。

您还需要与图书馆链接。您是如何链接的?“但是在链接时,我遇到了未定义的引用错误。”如果您逐字发布链接命令和错误消息(即复制和粘贴与控制台中显示的完全相同),这将非常有用。请阅读Dreper的论文。它详细地解释了请改进您的问题以展示一些。没有一个答案,你的问题就不清楚了(两个答案的理解都不一样)。因此,编辑您的问题,以显示完整(简化)的源代码以及您使用的所有编译命令
gcc
的参数顺序lot@BasileStarynkevitch:我想已经修好了。否则请随意编辑。谢谢请注意,命令行示例仍然很少—实际上可能需要其他参数。