提示存档文件中的动态库依赖项



在我的 c/c++ 混合项目中,我正在构建各个文件夹的源文件,将它们与ar一起存档到它们自己的.a文件中,然后在最后阶段将它们链接在一起。目前为止,一切都好。我的问题是,是否可以在ar阶段暗示任何动态库依赖项,这样就不必在链接阶段明确指定它们?

我的意思是,如果一个组件依赖于 pthread,并且最终的二进制文件需要针对它进行链接,可能是动态的,那么它是否可以不将此依赖项添加到存档中,以便稍后由链接器解决?

使用链接器而不是ar来创建部分链接的对象而不是存档是否会提供任何此类工具来暗示在最终链接阶段满足动态 lib 依赖项?

您可以使用 GNU 的 'l' 选项ar.
正如手册页所说:

l   Specify dependencies of this library.  The dependencies must immediately
follow this option character, must use the same syntax as the
linker command line, and must be specified within a single argument.
I.e., if multiple items are needed, they must be quoted to form
a single command line argument.  For example
L "-L/usr/local/lib -lmydep1 -lmydep2"

ar将此数据存储在成员"__.LIBDEP",嵌入在.a文件中,可以使用ar p mylib.a __.LIBDEP

$ cat static_lib_test.c

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/syscall.h>
#include <unistd.h>
_Noreturn void *start(void *arg)
{
fprintf(stderr, "child (%d) won!n", gettid());
syscall(SYS_exit_group, EXIT_SUCCESS);
}
int main(int argc, const char *argv[])
{
pthread_t thread;
if (pthread_create(&thread, NULL, start, (void *) 0) < 0)
{
fprintf(stderr, "error: unable to create new threadn");
exit(EXIT_FAILURE);
}
fprintf(stderr, "Race begin!n");
fprintf(stderr, "parent (%d) won!n", gettid());
syscall(SYS_exit_group, EXIT_SUCCESS);
}

编译:
$ gcc -Wall -c static_lib_test.c -o static_lib_test.o
存档:
$ ar rcvsl "-L/usr/lib -lpthread" static_lib_test.a static_lib_test.o
链接:
$ gcc $(ar p static_lib_test.a __.LIBDEP | tr '' 'n') -o static_lib_test static_lib_test.a
示例运行:$ ./static_lib_test

Race begin!
parent (13547) won!

测试于: Linux arch 5.11.13-zen1-1-zen, GNU ar (GNU Binutils( 2.36.1

相关内容

  • 没有找到相关文章