autotools用户如何指定静态和动态链接的组合?

tpr*_*k77 11 autotools dynamic-linking libtool static-linking

我正在用autoconf,automake和libtool构建一个程序.我的工作要求我静态链接(大多数)库.这在过去并不是一个问题,因为我可以静态地将所有内容联系起来 -all-static.现在这是一个问题因为我必须使用一个只是动态的库; 它是由第三方给我们的,我们没有来源.

当然,-all-static现在导致构建失败.是否有可能告诉libtool静态链接所有内容,除了这个库?是否有可能让libtool进行静态和动态链接的任何组合,还是全部或全部?

到目前为止,我已经尝试创建一个便利库LDFLAGS = -static,这取决于我想要静态链接的库.但libtool并没有像我希望的那样连接静态库.取决于便利库的程序仍然动态地链接所有内容.

我也尝试过--disable-shared,但这并没有影响构建.


这些问题类似,但没有真正回答我的问题:

使用Libtool强制将静态库链接到共享库

是否有可能将一些(但不是全部)库静态链接到libtool?

(我不想从我的系统中删除共享库,并且指定所有内容的完整路径并不比手动链接更好,但也许这是唯一的方法.)

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在适当的地方替换.

  • 我给出了最简单的方法.但是,对于某些奇特的东西,你可以将标志拉入`configure.ac`.在那里,你可以通过调用`AC_SUBST([DYNLIBS])`添加`DYNLIBS =" - Wl,-Bdynamic,-L/path/to,-lshared,-Bstatic".那么你需要做的就是在`Makefile.am`中调用`$(DYNLIBS)`.这会给你一个更多的控制,但请记住`AC_CHECK_LIBS`不检查静态与动态库.这是你想要的还是有其他东西可以使它更灵活? (2认同)