c - .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

:::::

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 文件不起作用,也不是必需的 - 所有代码都静态链接到我的程序

gcc main.c cpld-cmd.o -o myprogram

关于c - .so 文件如何查找符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52064206/

相关文章:

java - JNI 绑定(bind) - undefined symbol : gcj_personality_v0

c++ - std::to_chars编译但未在MacOS/clang上链接

python - 编译程序使其独立于系统

c++ - 链接错误 : Undefined Symbols, 很多(cpp 交叉编译)

c++ - 使用 operator new 从 C 实例化 C++ 对象

c - GTK: "key-press-event"按下 Shift 时的处理

c - malloc 函数在 C 中如何工作?

c - 在函数中查找数组的长度

makefile - 如何制作轨道时间戳

c - Ruby/C/Makefile,-lpcap/#include <pcap.h> 中使用的默认 pcap.h 文件是什么