我有一个.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
::::
答案 0 :(得分:1)
您似乎对共享库的工作方式有误解。 .so文件包含定义,.o文件也是如此。一个用于动态链接,另一个用于静态链接。您需要同时使用一个,但不要同时使用。
例如,假设您提供了共享的共享库libcpld-cmd.so
,例如,您希望将其链接到源main.c
的代码,然后:
gcc main.c -lcpld-cmd.so -o myprogram
链接器将处理cpld-cmd.so来解析符号,但实际上不会链接其中的目标代码-这将是静态链接。
当您随后运行myprogram
时,该库必须可用,并且OS加载程序会在运行时动态链接该库代码。
参考:http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
另一方面,如果您想静态链接,则可以链接cpld-cmd.o
,而.so文件不起作用,也不是必需的-所有代码都静态链接到myprogram
中。 / p>
gcc main.c cpld-cmd.o -o myprogram
答案 1 :(得分:0)
我有一个.so文件,其中包含一些外部函数声明。这些功能的定义以二进制形式存在,我在其中链接了.so文件。但是在链接时,我得到了未定义的参考错误。
然后,您应该使用-rdynamic
标志(当然还有-ldl
库来提供{{)来链接主程序(正在调用dlopen(3)或与库链接) 1}}(如果使用的话)。
也请阅读Drepper的How To Write Shared Libraries论文。