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(至少数百个)。每次更改库的依赖项时,我们都需要这样做。链接器脚本听起来很棒!我是否将它放在共享对象的“正常”库路径中?