繁体   English   中英

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

[英]Link .a library to .o object so only .o needs to be included when building

我正在使用一个名为“ 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文件?

您可以执行相反的操作,并使用ar将io.o文件添加到.a文件:

ar q libdscud-6.02.a io.o

一种解决方案是简单地使用make变量:

IO_STUFF = libdscud-6.02a io.o

...

$(CC) $(IO_STUFF) ...

AFAIK无法链接.a库和.o文件来创建另一个中间文件,即未链接为.o文件的文件。 Burton Samograd提供的解决方案看起来是一个很好的选择。 但是如果您不允许修改.a库文件,那么在使用make进行构建时,可以遵循DarkDust提供的建议。
但是,您可以从.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的可执行路径,应在加载器(ld)的查找路径(即LD_LIBRARY_PATH)中。
与共享对象的工作权的方式是创建一个libio.so这是命名约定,而不是 io.so和构建代码gcc test.c -o test -L<path_to_libio.so> -lio和路径libio.so应该在ld的查找路径中,以执行输出可执行文件。
我知道创建共享库只是为了避免添加另一个文件进行编译似乎不是您想要的...但是它只是为您的信息提供服务,以防您不知道:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM