我有一个.so文件,其中包含一些extern
函数声明。 这些函数的定义在二进制文件中,我就是 链接 .so 文件。但是在链接时,我得到了未定义的引用 错误。
有没有办法在 .so 的 makefile 中提供一些路径以进行符号查找。
我用objdump
在.so(extern声明(和.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 文件也是如此。 一个用于动态链接,另一个用于静态链接。 您需要在另一个上使用,但不能同时使用两者。
例如,假设给定您的共享库libcpld-cmd.so
,并且您希望将其链接到带有源main.c
的代码,例如:
gcc main.c -lcpld-cmd.so -o myprogram
链接器将处理 cpld-cmd.so 以解析符号,但实际上不会链接其中的目标代码 - 这将是一个静态链接。
然后运行myprogram
时,库必须可用,并且操作系统加载程序将在运行时动态链接库代码。
参考: http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
另一方面,如果您想静态链接,您将链接cpld-cmd.o
,并且.so文件不起作用,也不是必需的 - 所有代码都静态链接到myprogram
中。
gcc main.c cpld-cmd.o -o myprogram
我有一个 .so 文件,其中包含一些 extern 函数声明。这些函数的定义在我链接到 .so 文件的二进制文件中。但是在链接时,我遇到了未定义的引用错误。
然后你应该将你的主程序(调用 dlopen(3(,或者与你的库链接(与-rdynamic
标志链接 (当然还有提供dlopen
的-ldl
库,如果你使用它的话(。
另请阅读 Drepper 的《如何编写共享库》论文。