C++ 如何创建自动链接到动态库的静态库?

C++ 如何创建自动链接到动态库的静态库?,c++,linker,shared-libraries,unix-ar,.a,C++,Linker,Shared Libraries,Unix Ar,.a,我维护我们的内部基础设施库—我们称之为libcluracan。此库必须静态链接,因为它不存在于使用代码的外部计算机上 这意味着不是使用链接器创建libcluracan.so文件,而是使用ar命令创建libcluracan.a文件 现在,我正试图向libcluracan添加一些新功能,但它需要与外部库链接—特别是-lfltk,但具体细节并不重要。重要的是,我可以假设外部计算机拥有这个库(以及我需要的任何其他公共可用库) 最大的问题是我不能改变内部程序员编译(链接)代码的方式 如果我们一直在使用动态

我维护我们的内部基础设施库—我们称之为
libcluracan
。此库必须静态链接,因为它不存在于使用代码的外部计算机上

这意味着不是使用链接器创建
libcluracan.so
文件,而是使用
ar
命令创建
libcluracan.a
文件

现在,我正试图向
libcluracan
添加一些新功能,但它需要与外部库链接—特别是
-lfltk
,但具体细节并不重要。重要的是,我可以假设外部计算机拥有这个库(以及我需要的任何其他公共可用库)

最大的问题是我不能改变内部程序员编译(链接)代码的方式

如果我们一直在使用动态的
libcluracan.so
库,我只需将
-lfltk
添加到链接器中,然后忘记它-程序员将继续链接
-lcluracan
并自动获取
-lfltk

我需要找到一种方法,用我们的静态
libcluracan.a
库做同样的事情

TL;DR

有没有办法创建一个静态
。一个自动链接到另一个动态
库。所以使用时

最大的问题是我不能改变内部程序员编译(链接)代码的方式


这确实是一个大问题。您的内部程序员应该使用
make
(或类似的自动构建系统),而更改将是微不足道的

在任意UNIX系统上无法实现所需的功能

如果您正在使用GNU工具链,尤其是GNU ld或
gold
,那么您可以通过链接
libcluracan.so
,实现您想要的功能,其中
libcluracan.so
不是共享库,而是链接器脚本,如下所示:

GROUP ( libcluracan.a libfltk.so )
最大的问题是我不能改变内部程序员编译(链接)代码的方式


这确实是一个大问题。您的内部程序员应该使用
make
(或类似的自动构建系统),而更改将是微不足道的

在任意UNIX系统上无法实现所需的功能

如果您正在使用GNU工具链,尤其是GNU ld或
gold
,那么您可以通过链接
libcluracan.so
,实现您想要的功能,其中
libcluracan.so
不是共享库,而是链接器脚本,如下所示:

GROUP ( libcluracan.a libfltk.so )

我不确定,但如果您只是在程序中包含新的头文件并静态编译它,那么它应该在执行时自动搜索动态库。我用Windows做了这个。我的Qt应用程序是静态编译的,但我在程序执行时将其与一个新的DLL链接。@AbhishekBansal-这是可行的,但它要求使用库的程序员也与
-lfltk
链接,否则链接时会出现“未定义符号”错误。不幸的是,我无法更改他们链接代码的方式:(那么你也想在静态可执行文件中嵌入动态库吗?我不知道如果不静态重新编译新库是否可行。@AbhishekBansal-我不想在可执行文件中嵌入
-lfltk
。我想让可执行文件动态链接到
-lfltk
,但不需要程序员添加将
-lfltk
标志添加到他们的链接器命令中。我希望当他们链接到
libcluracan.a
时,它会自动添加
-lfltk
(如果
libcluracan
是一个动态库,则可能会这样)我不相信gcc支持自动链接。我不确定,但如果您只是在程序中包含新的头文件并进行静态编译,那么它应该在执行时自动搜索动态库。我在Windows中完成了此操作。我的Qt应用程序正在进行静态编译,但我正在使用程序ex上的新DLL链接它ecution.@AbhishekBansal-这是可行的,但它要求使用库的程序员也链接到
-lfltk
,否则链接时会出现“未定义符号”错误。不幸的是,我无法更改他们链接代码的方式:(那么你也想在静态可执行文件中嵌入动态库吗?我不知道如果不静态重新编译新库是否可行。@AbhishekBansal-我不想在可执行文件中嵌入
-lfltk
。我想让可执行文件动态链接到
-lfltk
,但不需要程序员添加
-lfltk
标志被添加到他们的链接器命令中。我希望当他们链接到
libcluracan.a
时,它会自动添加
-lfltk
(如果
libcluracan
是一个动态库,这也是可能的)我不相信gcc支持自动链接。“您的内部程序员应该使用make…而更改将是微不足道的”实际上,更改不会是微不足道的,因为我们必须更改所有不同项目的所有makefile(至少数百个)。每次更改库的依赖项时,我们都需要这样做。链接器脚本听起来很棒!我是否将它放在共享对象的“正常”库路径中?“您的内部程序员应该使用make…而更改将是微不足道的“实际上,更改并不是微不足道的,因为我们必须更改所有不同项目的所有makefile(至少数百个)。每次更改库的依赖项时,我们都需要这样做。链接器脚本听起来很棒!我是否将它放在共享对象的“正常”库路径中?