tpr*_*k77 11 autotools dynamic-linking libtool static-linking
我正在用autoconf,automake和libtool构建一个程序.我的工作要求我静态链接(大多数)库.这在过去并不是一个问题,因为我可以静态地将所有内容联系起来
-all-static.现在这是一个问题因为我必须使用一个只是动态的库; 它是由第三方给我们的,我们没有来源.
当然,-all-static现在导致构建失败.是否有可能告诉libtool静态链接所有内容,除了这个库?是否有可能让libtool进行静态和动态链接的任何组合,还是全部或全部?
到目前为止,我已经尝试创建一个便利库LDFLAGS = -static,这取决于我想要静态链接的库.但libtool并没有像我希望的那样连接静态库.取决于便利库的程序仍然动态地链接所有内容.
我也尝试过--disable-shared,但这并没有影响构建.
这些问题类似,但没有真正回答我的问题:
(我不想从我的系统中删除共享库,并且指定所有内容的完整路径并不比手动链接更好,但也许这是唯一的方法.)
Nic*_*ckW 11
您没有指定操作系统,但让我们假设它是一个相对较新的Unix/Linux/OSX.如果不是,则忽略以下警告.
在回答之前,您应该知道在大多数基于ELF的系统(Unix/Linux)上混合静态和共享代码是有问题的.一个原因是,如果您忘记重新链接更新的依赖项,则可能导致代码失去同步.另一个原因是静态代码与PIC的性质.这就是libtool试图阻止它的原因.
话虽如此,在Makefile.am中(假设您的最终程序是foo和共享库):
.
.
.
foo_SOURCES = foo.c abc.c def.c hij.c
foo_LDFLAGS = -all-static -Wl,-Bdynamic,-L/path/to,-lshared,-Bstatic
foo_LDADD = -L../path/to -lbar -lbaz
Run Code Online (Sandbox Code Playgroud)
这里重要的是libtool让你短路的检查和GNU gcc的-static通过传递标志(这是使用libtool的)-Wl,参数直接给连接器(GNU LD).要在参数之间放置空格,请使用逗号,分隔符.
双方-Bstatic并-Bdynamic记录在GNU ld的信息页面,以及帮助屏幕.同样,既然你没有提到正在使用的os或编译器包,我假设在Linux上使用GNU gcc和GNU ld.您可能需要通过使用来验证ld --help自己.如果由于某种原因,它不是GNU ld,那么你需要找到等价的标志,-Bstatic并-Bdynamic在适当的地方替换.
| 归档时间: |
|
| 查看次数: |
10100 次 |
| 最近记录: |