将.a库链接到.o对象,因此在构建时只需要包含.o

时间:2011-09-08 14:11:18

标签: c linux gcc makefile ld

我正在使用一个名为'libdscud-6.02.a'的预构建库,其中包含许多针对某些特定硬件的低级I / O调用。从这开始,我创建了一些包装函数,我将其编译成一个名为'io.o'的对象文件。

现在,我有一些程序正在编译这些I / O函数,而不是必须这样做:

gcc libdscud-6.02a io.o -o test test.c

我想要这样:

gcc io.o -o test test.c

有没有办法将.a文件链接到.o文件中,所以我只需要在编译二进制文件时包含.o文件?

3 个答案:

答案 0 :(得分:3)

您可以执行相反的操作,并使用ar:

将io.o文件添加到.a文件中
ar q libdscud-6.02.a io.o

答案 1 :(得分:1)

一种解决方案就是使用make变量:

IO_STUFF = libdscud-6.02a io.o

...

$(CC) $(IO_STUFF) ...

答案 2 :(得分:1)

AFAIK无法链接.a库和.o文件来创建另一个中间文件,即未链接的文件,如.o文件。 Burton Samograd提供的解决方案看起来是一个非常好的选择;但是如果您不允许修改.a库文件,那么您可以按照DarkDust提供的建议,以防您使用make进行构建。
但是,您可以从.a库文件和.o文件创建共享库.so文件(我认为这是Michael Burr试图传达的内容)。您只能使用共享库而不是.a& .o文件生成可执行文件如下:
生成共享库gcc io.o libdscud-6.02.a -shared -o io.so(请注意,为链接传递的文件顺序很重要)
使用gcc io.so -o test test.c构建源代码。要执行io.so的可执行路径,应该在loader(ld)的查找路径中,即LD_LIBRARY_PATH。 使用共享对象的正确方法是创建libio.so这是命名约定而 io.so并将代码构建为gcc test.c -o test -L<path_to_libio.so> -liolibio.so的路径{1}}应该在ld的查找路径中执行输出可执行文件 我知道创建共享库只是为了避免添加另一个文件进行编译似乎不是你想要做的...但它只是为了你的信息,如果你还不知道:)