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

hint the dynamic library dependencies in the archive file

在我的 c/c++ 混合项目中,我正在构建各个文件夹的源文件,使用 ar 将它们归档到它们自己的 .a 文件中,然后 link在最后阶段将它们全部整合在一起。到目前为止,一切都很好。我的问题是,是否可以在 ar 阶段提示任何动态库依赖项,因此不必在 linking 阶段明确指定它们?

我的意思是,如果一个组件依赖于 pthread 并且最终的二进制文件需要 link 反对它,可能是动态的,它不能将这种依赖性添加到存档中,稍后由 link嗯?

是否会使用 linker 而不是 ar 来创建部分 linked 对象而不是存档提供任何此类设施来暗示动态库依赖关系在最终 link舞台?

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

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 将此数据存储在嵌入在 .a 文件中的成员“__.LIBDEP”中,可以使用 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 thread\n");
        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
Link:
$ gcc $(ar p static_lib_test.a __.LIBDEP | tr '[=19=]' '\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