标签: autotools

如何使用Autoconf通过"./configure"设置定义

我有一个项目可以基于一个定义生成两个不同的应用程序.

libfoo_la_CXXFLAGS = -DMYDEFINE
Run Code Online (Sandbox Code Playgroud)

我必须修改Makefile.am来设置这个定义,所以它不是自动的.

我可以通过configure命令以某种方式设置此定义吗?有没有其他方法可以使用autotools设置一个定义?

c++ automake autoconf autotools configure

12
推荐指数
2
解决办法
9854
查看次数

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

我有一个库(libfoo),使用libtool编译成两个对象:libfoo.a和libfoo.so.

我还必须使用libtool创建另一个库(libbar),它将是一个包含所有libfoo代码的共享库(libbar.so).

为了做到这一点,我必须强制libbar链接libfoo.a,而不是libfoo.so.

我在autotools环境中,所以我必须使用标准的configure.inMakefile.am规则来解决这个问题.

我试过几件事,比如configure.in:

LDFLAGS="$LDFLAGS "-Wl,-Bstatic -lfoo -Wl,-Bdynamic"
Run Code Online (Sandbox Code Playgroud)

这总是会在链接行上产生-Wl标志; 但是-lfoo已经消失了,并且在它的开头被放置在绝对路径形式(/opt/foo/lib/libfoo.so)中.

我也尝试过:

LDFLAGS="$LDFLAGS "-L/opt/foo/lib libfoo.a"
Run Code Online (Sandbox Code Playgroud)

或者在Makefile.am中:

libbar_la_LDADD = -Wl,-Bstatic -lfoo -Wl,-Bdynamic
Run Code Online (Sandbox Code Playgroud)

libbar_la_LTLIBRARIES = libfoo.a
Run Code Online (Sandbox Code Playgroud)

等等(有很多很多变种!)

但我认为我绝对不具备Autotools/Libtool足够的知识来解决这个问题.我无法在网上找到有关它的信息,总是略有不同的问题.

static shared autotools libtool

11
推荐指数
2
解决办法
5018
查看次数

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

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

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

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

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


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

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

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

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

autotools dynamic-linking libtool static-linking

11
推荐指数
1
解决办法
1万
查看次数

automake错误:未找到AM_INIT_AUTOMAKE的正确调用

我是autotools的新手,并且遵循本教程.但我无法解决这个错误,

   $ automake
   configure.ac: error: no proper invocation of AM_INIT_AUTOMAKE was found.
   ..
   Makefile.am: error: required file './depcomp' not found
   ..
   /usr/share/automake-1.12/am/depend2.am: error: am__fastdepCC does not appear in AM_CONDITIONAL
  ..
  /usr/share/automake-1.12/am/depend2.am: error: AMDEP does not appear in AM_CONDITIONAL
  ..
Run Code Online (Sandbox Code Playgroud)

我的configure.ac档案是

   # -*- Autoconf -*-
   # Process this file with autoconf to produce a configure script.

   AC_PREREQ([2.69])
   AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
   AM_INIT_AUTOMAKE(hello,1.0)
   AC_CONFIG_SRCDIR([config.h.in])
   AM_CONFIG_HEADERS(config.h)

   # Checks for programs.
   AC_PROG_CC

   # Checks for libraries.

   # Checks for …
Run Code Online (Sandbox Code Playgroud)

automake autotools

11
推荐指数
2
解决办法
2万
查看次数

如何在include_HEADERS上一起使用autotools nobase和nodist前缀

我在子目录中有一些头文件,必须将其复制到include目录中的同名子目录.我可以使用nobase前缀来实现(我正在使用heimdal代码,fyi):

nobase_include_HEADERS = hcrypto/aes.h \
      hcrypto/bn.h      \
      hcrypto/cmac.h    \
      hcrypto/des.h     \
      hcrypto/dh.h      \
      hcrypto/dsa.h     \
etc...
Run Code Online (Sandbox Code Playgroud)

但是其中一些头文件是在构建过程中生成的(因为heimdal必须在这些头文件存在之前构建),所以我需要使用nodist前缀以便dist不会死.

我发现一篇文章说我可以一起使用它们,甚至提供了一个类似的例子,所以我这样做了:

nobase_nodist_include_HEADERS = hcrypto/aes.h \
      hcrypto/bn.h      \
      hcrypto/cmac.h    \
      hcrypto/des.h     \
      hcrypto/dh.h      \
      hcrypto/dsa.h     \
etc...
Run Code Online (Sandbox Code Playgroud)

我没有注意到任何警告或错误,但这些头文件不会被复制到我的include目录.我做错了什么,或者autotools中有错误吗?

有趣的是,如果我反转前缀,我会收到此错误:

Makefile.am:93: error: 'nodist_nobase_include_HEADERS' is used but 'nobase_includedir' is undefined
Run Code Online (Sandbox Code Playgroud)

这个错误的原因在automake文档中有解释:

当与'dist_'或'nodist_'一起使用时,应首先指定'nobase_'

我还定义了nodist_include_HEADERS(这是有效的).也许这两个定义会导致某种冲突?

我刚刚尝试删除nodist_include_HEADERS并将所有标题放在nobase_nodist_include_HEADERS行下,但现在我的标题已经安装完了.

Automake和系统信息:automake(GNU automake)1.13.4 openSUSE 13.2(x86_64)

c automake autotools

11
推荐指数
1
解决办法
802
查看次数

是否有终端工具为Vala项目自动生成autoconf/automake makefile?

我正在尝试创建一个Vala项目,看看我喜欢使用该语言进行开发,以此作为Mono的替代品.我认为automake的东西可以用来生成一个包含所有必要文件的项目模板(没有我的.vala代码).任何帮助,将不胜感激.

autotools vala

10
推荐指数
1
解决办法
1023
查看次数

如何在运行时删除LD_LIBRARY_PATH?

我正在构建一个使用Intel的IPP库的C++应用程序.默认情况下,此库安装在/ opt中,并且要求您设置LD_LIBRARY_PATH编译和运行软件(如果选择共享库链接,我会这样做).我已经修改了我configure.ac/ Makefile.am我在编译时不需要设置该变量,但是我仍然无法在运行时找到共享库; 我怎么做?

我正在使用-Wl, -R/path/to/libdir标志进行编译g++

更新1:实际上我的二进制程序有一些正确链接的IPP库,但只有一个不是:

$ ldd myprogram
linux-vdso.so.1 =>  (0x00007fffa93ff000)
libippacem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippacem64t.so.6.0 (0x00007f22c2fa3000)
libippsem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippsem64t.so.6.0 (0x00007f22c2d20000)
libippcoreem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippcoreem64t.so.6.0 (0x00007f22c2c14000)
[...]
libiomp5.so => not found
libiomp5.so => not found
libiomp5.so => not found
Run Code Online (Sandbox Code Playgroud)

当然图书馆在那里:

$ locate libiomp5.so
/opt/intel/ipp/6.0.2.076/em64t/sharedlib/libiomp5.so
Run Code Online (Sandbox Code Playgroud)

c++ g++ autotools shared-libraries intel-ipp

10
推荐指数
2
解决办法
9068
查看次数

Autotools包括路径

我有一个类似的目录结构

Makefile.am
Configure.ac
         src/
             hello.c
             Makefile.am

         include/
             hello.h
Run Code Online (Sandbox Code Playgroud)

如何在src的Makefile.am中指定包含路径,使其包含来自include/dir的头文件以及c文件取决于头文件.因此,如果我修改任何.h文件,它会强制重新编译.cc文件.

定义AM_CPPFLAGS'正在发出警告

configure.ac:5: warning: macro `AM_CPPFLAGS' not found in library
Run Code Online (Sandbox Code Playgroud)

autotools

10
推荐指数
1
解决办法
1万
查看次数

为什么clang -dumpversion报告4.2.1

我试图使用-dumpversion来确定编译器是否可用.我的项目用clang和更新的gcc编译,但不是用旧的gcc 4.2.1编译.

那为什么clang假装是一个老gcc?

额外的问题,是否可以在运行时更改此值?

或者有没有人有一个很好的autoconf宏来确定与clang和gcc的编译器版本?

autotools clang

10
推荐指数
1
解决办法
1136
查看次数

将自动化软件构建到LLVM bitcode

我想使用autotools构建系统将软件编译为LLVM bitcode; 也就是说,我希望最后获得的可执行文件是LLVM bitcode,而不是实际的机器代码.

(目标是能够在整个程序上运行LLVM bitcode分析工具.)

我已经尝试过CC="clang -emit-llvm -use-gold-plugins"configure脚本指定和变种,但无济于事.总会出现问题(例如,包构建.a静态库,链接器拒绝这些库).

在我看来,正确的方法是LLVM bitcode应该是一个交叉编译目标.要设置--host=,但没有这样的标准目标(即使Knuth的MMIX有目标).

到目前为止,我已经使用过kludges,例如手动编译CC="clang -emit-llvm -use-gold-plugins"和运行链接线(使用llvm-ldllvm-link).这适用于简单的包,例如grep.

我想要一个健壮的方法,并且适用于大多数(如果不是全部)配置脚本,包括存在中间.a文件或中间目标时.

autotools llvm llvm-clang

10
推荐指数
1
解决办法
1073
查看次数