2016-10-16 51 views
0

我试图从'test.c'& test.exp文件构建共享库lib_test.so。这lib_test.so文件将用作另一个应用程序的扩展。 应用程序文档通过以下命令指定代TLE lib_test.so文件的直接在单次通过:拆分生成一个共享对象库(.so)文件,而不是一个

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

但我的要求是建立在两次通过库:

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

我尝试这样做如下:

  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

可否请您建议的过程分成两个传递正确的方法...

感谢&问候。

+0

你的意思是“它没有生成正确的'lib_test.so'文件”?你有构建错误吗?加载库时出错?还有别的吗?请详细说明。 –

+0

当我一次构建'lib_test.so'时,我得到12619字节大小的文件,应用程序加载该库很好,但在构建两次使用时,输出'lib_test.so'文件为11816字节,应用程序显示'loading extension failed' for'lib_test.so'错误。 – Anirban

回答

1

与GCC前端程序gcc和实际链接程序ld链接的最大区别在于GCC前端添加了一些要链接的库。最值得注意的是GCC运行时库(-lgcc_s-lgcc)和实际的标准C库(-lc)。

当您直接调用ld时,不要告诉它与这些库链接。

在您不知情的情况下,可能还会有其他库和标志GCC前端传递到ld。对于“单程”构建,请将标志-v传递给gcc以获取详细输出,并查看它使用的参数,标志和库。

1

你很少想用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 

在你的第二个步骤。

+0

我无法在构建库时手动运行这些命令。我必须将我的代码(即'test.c'和'test.exp')放到指定的目录中,并在makefile中添加'CFLAGS = '和'LDFLAGS = ',并且应用程序运行'gcc -c $ {CFLAGS} -o $ {OFILE} $ {IFILE}'来编译并生成'test.o',然后运行'ld $ {LDFLAGS} -o $ {SOFILE} $ {OFILE}'。所有这些都是在内部完成的,我只需要使用''gcc'&'ld'来给出正确的标志来获取lib_'test.so',所以我要求两步构建。 – Anirban

相关问题