我建立对于autoconf,automake的,和libtool的程序。 我的工作需要我静态链接(大部分)库。 这并没有在过去的一个问题,因为我可以用静态链接的一切-all-static
。 现在,这是一个问题,因为我必须使用一个库,它仅仅是动态的; 它给我们一个第三方,而我们没有源。
当然, -all-static
现在造成编译失败。 是否有可能告诉libtool的静态链接的一切,除了这一个图书馆吗? 是否有可能有做的libtool静态和动态链接的任意组合,或者是全有或全无?
到目前为止,我已经尝试创建一个方便的图书馆LDFLAGS = -static
,这取决于我想静态链接库。 但libtool的不串联静态库,就像我本来希望。 根据便利库程序还是动态链接的一切。
我也试着--disable-shared
,但是这并没有影响编译。
这些问题是相似的,但真的不回答我的问题:
强制链接静态库到一个共享一个与Libtool程序
是否有可能把其中一些-库与静态的libtool -但不是全部?
(我不想从我的系统中删除共享库,并specifing一切的完整路径并不比手工连接好,但也许这是唯一的方法。)
没有指定的操作系统,但我们认为它是一个相对较新的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
这里重要的是libtool让你短路的检查和GNU gcc的-static
通过传递标志(这是使用libtool的) -Wl,
参数直接链接器(GNU LD)。 为了把参数,逗号之间的空间,
用来分隔符。
无论-Bstatic
和-Bdynamic
都记录在GNU ld的信息页面 ,以及帮助屏幕。 同样,因为你没有提到正在使用的操作系统或编译器包,我假设GNU gcc和GNU LD在Linux上。 您可能需要使用验证ld --help
看到自己。 如果由于某种原因,它不是GNU LD,那么你就需要找到等价标志,以-Bstatic
和-Bdynamic
,替换在适当情况下。
文章来源: How can an autotools user specify a combination of static & dynamic linking?