我有一个项目可以基于一个定义生成两个不同的应用程序.
libfoo_la_CXXFLAGS = -DMYDEFINE
Run Code Online (Sandbox Code Playgroud)
我必须修改Makefile.am来设置这个定义,所以它不是自动的.
我可以通过configure命令以某种方式设置此定义吗?有没有其他方法可以使用autotools设置一个定义?
我有一个库(libfoo),使用libtool编译成两个对象:libfoo.a和libfoo.so.
我还必须使用libtool创建另一个库(libbar),它将是一个包含所有libfoo代码的共享库(libbar.so).
为了做到这一点,我必须强制libbar链接libfoo.a,而不是libfoo.so.
我在autotools环境中,所以我必须使用标准的configure.in或Makefile.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足够的知识来解决这个问题.我无法在网上找到有关它的信息,总是略有不同的问题.
我正在用autoconf,automake和libtool构建一个程序.我的工作要求我静态链接(大多数)库.这在过去并不是一个问题,因为我可以静态地将所有内容联系起来
-all-static.现在这是一个问题因为我必须使用一个只是动态的库; 它是由第三方给我们的,我们没有来源.
当然,-all-static现在导致构建失败.是否有可能告诉libtool静态链接所有内容,除了这个库?是否有可能让libtool进行静态和动态链接的任何组合,还是全部或全部?
到目前为止,我已经尝试创建一个便利库LDFLAGS = -static,这取决于我想要静态链接的库.但libtool并没有像我希望的那样连接静态库.取决于便利库的程序仍然动态地链接所有内容.
我也尝试过--disable-shared,但这并没有影响构建.
这些问题类似,但没有真正回答我的问题:
(我不想从我的系统中删除共享库,并且指定所有内容的完整路径并不比手动链接更好,但也许这是唯一的方法.)
我是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) 我在子目录中有一些头文件,必须将其复制到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)
我正在尝试创建一个Vala项目,看看我喜欢使用该语言进行开发,以此作为Mono的替代品.我认为automake的东西可以用来生成一个包含所有必要文件的项目模板(没有我的.vala代码).任何帮助,将不胜感激.
我正在构建一个使用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) 我有一个类似的目录结构
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) 我试图使用-dumpversion来确定编译器是否可用.我的项目用clang和更新的gcc编译,但不是用旧的gcc 4.2.1编译.
那为什么clang假装是一个老gcc?
额外的问题,是否可以在运行时更改此值?
或者有没有人有一个很好的autoconf宏来确定与clang和gcc的编译器版本?
我想使用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-ld或llvm-link).这适用于简单的包,例如grep.
我想要一个健壮的方法,并且适用于大多数(如果不是全部)配置脚本,包括存在中间.a文件或中间目标时.