如何强制静态库包含它的依赖项?

How to force static library to include it dependencies?

我用 gcc 和 ar 构建了我自己的静态库。

g++ \
    ... list of library sources ... \
    ... a lot of -L -l -I -D options etc... \
    -c \
    && ar crf ./lib/libpackager.a *.o

然后我在我的应用程序中使用这个库。目前我是这样建造的。

g++ \
    myApp.cpp \
    ... same -L -l -I options as in library ... \
    -L. -lpackager \
    -o myApp

它有效,但我有点奇怪,我需要在构建应用程序期间复制所有 -l-L。是否有可能在库中包含所有这些库依赖项。我的目标是构建这样的应用程序。

g++ myApp.cpp -L. -lpackager -o myApp

正在将评论转为答案。

在编译为目标文件时指定 -l-L 操作是无关紧要的。某些版本的 GCC 会警告不会使用的参数,因为它们是 link 时间参数,并且在包含 -c 标志时不会使用 linking。

ar 命令不知道如何处理 C 编译器的 -l-L 参数(它可能有自己的标志用途;一个版本的 ar 接受但忽略 -l)。

所以,当你link使用静态库时,你必须指定依赖项。这就是自 70 年代初以来的生活方式——这一方面至今没有改变。 可以使用依赖信息构建共享库,但不能使用静态库。

As I understand it, I need to build a shared library and link it in a static way, right?

没有。您要么需要构建并 link 一个共享库作为共享库,要么您需要接受使用静态库意味着您在使用该库时需要在命令行上指定其他库。有一些系统可以帮助管理此类信息; pkg-config 就是其中之一。 AFAIK,您不能 link 'static way' 中的共享库。