将共享对象库 (.so) 文件的生成分为两次而不是一次

Split generation of a Shared Object library (.so) file into two pass instead of one

我正在尝试从 'test.c' 和 test.exp 文件构建一个共享库 lib_test.so。此 lib_test.so 文件将用作另一个应用程序的扩展。 应用文档指定通过以下命令一次性直接生成 tle lib_test.so 文件:

`gcc -q64 -o lib_test.so test.c -bM:Sre -bE:test.exp -bnoentry`

但我的要求是分两次构建库:

  1. 使用gcc命令编译生成test.o文件。
  2. Link 使用 ld 命令生成库 lib_test.so

我试过如下:

  1. 执行编译步骤如下:gcc -q64 -c -o test.o test.c.
  2. 创建lib_test.so如下:ld -bM:Sre -bE:test.exp -bnoentry -o lib_test.so test.o

但它没有生成正确的 lib_test.so 文件。

我正在使用 Ubuntu 16.04 LTS 64 位和最新的 GCC

能否请您提出将流程分成两遍的正确方法...

感谢和问候。

您很少想使用 ld 来执行链接。 gcc 前端在设置正确标志等方面做得更好。因此,使用 gcc.

即而不是

ld -bM:Sre  -bE:test.exp -bnoentry -o lib_test.so test.o

gcc -bM:Sre  -bE:test.exp -bnoentry -o lib_test.so test.o

在你的第二步中。

link使用 GCC 前端程序 gcc 和实际 linker ld 的最大区别是 GCC 前端添加了一些库到link编辑。最值得注意的是 GCC 运行时库(-lgcc_s-lgcc)和实际的标准 C 库(-lc)。

当您直接调用 ld 时,您不会告诉它 link 那些库。

GCC 前端可能还会在您不知情的情况下传递给 ld 其他库和标志。对于 "one pass" 构建,将标志 -v 传递给 gcc 以获得详细输出并查看它使用的参数、标志和库。