一个自动工具的用户如何指定静态和动态链接的组合?(How can an autotools user

2019-07-17 12:24发布

我建立对于autoconf,automake的,和libtool的程序。 我的工作需要我静态链接(大部分)库。 这并没有在过去的一个问题,因为我可以用静态链接的一切-all-static 。 现在,这是一个问题,因为我必须使用一个库,它仅仅是动态的; 它给我们一个第三方,而我们没有源。

当然, -all-static现在造成编译失败。 是否有可能告诉libtool的静态链接的一切,除了这一个图书馆吗? 是否有可能有做的libtool静态和动态链接的任意组合,或者是全有或全无?

到目前为止,我已经尝试创建一个方便的图书馆LDFLAGS = -static ,这取决于我想静态链接库。 但libtool的不串联静态库,就像我本来希望。 根据便利库程序还是动态链接的一切。

我也试着--disable-shared ,但是这并没有影响编译。


这些问题是相似的,但真的不回答我的问题:

强制链接静态库到一个共享一个与Libtool程序

是否有可能把其中一些-库与静态的libtool -但不是全部?

(我不想从我的系统中删除共享库,并specifing一切的完整路径并不比手工连接好,但也许这是唯一的方法。)

Answer 1:

没有指定的操作系统,但我们认为它是一个相对较新的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?