2017-07-31 36 views
1

配置 我使用autotools(autoreconf -iv和./configure)来生成正确的makefile。在我的开发机器(Fedora)上,一切正常。对于make check我使用库libcheckautotools我使用Libtools。在Fedora上,检查库是动态的:libcheck.so.0.0.0或类似的东西。有用。如何通过autotools确定平台库是静态的还是动态的?

的问题 当我推提交给我在github上回购,做一个拉请求,其结果是在特拉维斯CI测试它使用的Ubuntu为平台。现在在Ubuntu上,libcheck是一个静态库:libcheck.a和一个libcheck_pic.a

当特拉维斯做了补充检查我得到以下错误消息:

/usr/bin/ld: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../.. /../libcheck.a(check.o): relocation R_X86_64_32 against .rodata.str1.1' 可 不创建共享对象时使用;与-fPIC`

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../libcheck.a: could not read symbols: Bad value

重新编译,这意味着我必须以某种方式让配置确定我所需要的库。我怀疑我需要Ubuntu的libcheck_pic.a和Fedora的常规libcheck.so。

问题 有谁知道如何将此集成到configure.ac和使用libtool测试/ Makefile.am?我宁愿保持符合autotools生活方式。

我找不到有用的信息使用谷歌,但有很多问题在那里关于静态和动态(这不是我所需要的)之间的区别是什么。

如果有人能指出我正确的方向,或者甚至可以解决这个问题,我将不胜感激。

回答

2

我怀疑你是对的,你想在CI系统上使用的图书馆是libcheck_pic.a,因为它的名字暗示其中的例程被编译为与位置无关的代码,正如你收到的错误信息表明你做。

然后,解决问题的一种方法是使用libcheck_pic(如果可用),否则返回原始libcheck。配置基于Autotools的构建系统并不难。然后在输出变量中记录适当的库名称,并在(自动)make文件中使用该名称。

Autoconf的SEARCH_LIBS宏专门用于这种优先库的搜索要求,但它具有修改LIBS变量的副作用,在这种情况下可能不需要。你可以让它工作。像这样的东西可能会做到这一点,例如:

LIBS_save=$LIBS 
AC_SEARCH_LIBS([ck_assert], [check_pic check], [ 
    # Optional: add a test to verify that the chosen lib really provides PIC code. 

    # Set LIBCHECK to the initial substring of $LIBS up to but excluding the first space. 
    LIBCHECK=${LIBS%% *} 
    ], [ 
    # or maybe make it a warning, and disable your test suite when libcheck 
    # is not available. 
    AC_MSG_ERROR([A PIC version of libcheck is required]) 
    ]) 
AC_OUTPUT([LIBCHECK]) 
LIBS=$LIBS_save 

我相信你知道怎么在制作侧$(LIBCHECK)做。

正如所写的那样,如果没有可用的libcheck的PIC版本,那么您将无法找到,直到makemake check。这是不可取的,你可以添加Autoconf代码来检测这种情况,如果它不够好。


作为一个完全不同的方法,你可以考虑建立你的测试静态(添加-static到合适*_LDFLAGS变量)。当然,这有相反的问题:如果库的静态版本不可用,那么构建或测试失败。另外,如果你还没有这样做,它需要构建你自己的代码的静态版本,此外,它是静态版本,将被测试。

为了获得最大的灵活性,您可以考虑结合这两种方法。您可以设置从一个到另一个的回退,或者可以为测试静态代码和PIC代码设置单独的目标,并且可以运行构建系统上可用的库支持它们中的任何一个(可能都是)。

+0

非常感谢您的回答。我会尝试一下方法,看看我能想出什么。如果库不可用,我特别喜欢禁用make check选项。尽管我更喜欢动态库,但我认为在之后测试_pic first和libcheck是有意义的。感谢您的解释。 +1 – guus

+0

你的评论导致了我应该一直看到的(后见之明)解决方案。我简单地用'AC_SEARCH_LIBS([tcase_create],[check_pic check])替换AC_CHECK_LIB([check],[tcase_create])''。从我的测试程序中,我可以测试检查库的可用性:HAVE_CHECK_H。这是从头部测试中设置的。我将这个答案标记为解决方案,尽管我只应用了其中的一部分。再次感谢您的回答! – guus

相关问题