我需要根据库的存在有条件地编译一些代码.使用autoconf/automake似乎应该很容易,但我无法弄明白.
例如,如果存在PNG库,我想包含使用它的代码.我的configure.ac有:
AC_CHECK_LIB([png], [png_create_write_struct_2])
Run Code Online (Sandbox Code Playgroud)
我的Makefile.am有:
if USE_LIBPNG
libdev_la_SOURCES += png.c
endif
Run Code Online (Sandbox Code Playgroud)
(它将png.c添加到libdev的源列表中,以便进行编译).
像USE_LIBPNG这样的automake条件要求在configure.ac中定义条件,所以我需要:
AM_CONDITIONAL([USE_LIBPNG], [test SOMETHINGOROTHER])
Run Code Online (Sandbox Code Playgroud)
问题是,什么可以测试SOMETHINGOROTHER?AC_CHECK_LIB定义了什么,我可以测试?
AC_CHECK_LIB的默认行为是定义一个可以在源代码中使用的符号(在config.h中),但这对Makefile没有帮助,因为AM_CONDITIONAL需要shell测试
我尝试覆盖默认的AC_CHECK_LIB行为,如下所示:
AC_CHECK_LIB([png], [png_create_write_struct_2], [HAS_LIBPNG=1])
Run Code Online (Sandbox Code Playgroud)
之后我可以测试它:
AM_CONDITIONAL([USE_LIBPNG], [test "x$HAS_LIBPNG" = "x1"])
Run Code Online (Sandbox Code Playgroud)
这很丑陋,但适用于Makefile ...但是会产生一个新问题:因为它丢弃了原来的AC_CHECK_LIB行为,而且我不再在config.h中添加一个符号,这是我需要的.
我必须遗漏一些基本的东西,或者可能做错了.已经挖了几个小时,没有找到答案.
任何人?
我有一个通过Autoconf配置的项目,我想在这个项目中开始使用C++ 11功能.如何始终启用"-std = gnu ++ 0x"开关并支持配置时检查的功能?
不幸的是,我很难为ARMv6架构交叉编译Git.
但在我开始描述我已经采取的步骤和我输入的命令之前,我应该简要描述一下构建环境:
/home/my_name/cctoolchain
(该目录包含了bin/
,lib/
等).我从这里开始抓住Git 1.8.2 .解压缩后运行的目录:
export PATH=$PATH:/home/my_name/cctoolchain/bin
我也跑去autoconf
确保它./configure
是最新的.然后我调用./configure
如下:
./configure --prefix=/home/my_name/git-arm --build=x86_64-linux-gnu --host=arm-linux-androideabi
这运行了几秒钟然后中止了:
checking whether system succeeds to read fopen'ed directory... configure: error: in `/home/my_name/git-1.8.2': configure: error: cannot run test program while cross compiling
我打开configure.ac
并删除了806-825行,禁用了测试.在这之后,我还必须删除806-839行,原因类似.
此时,./configure
脚本能够完成.然后我兴奋地跑去make
构建Git,经过几分钟后,遇到了这个错误:
fetch-pack.c: In function 'fetch_pack': fetch-pack.c:928:16: error: 'struct stat' has no member named 'st_mtim' make: *** [fetch-pack.o] Error 1
不知何故,我感觉自己"做错了".这听起来比手动删除测试要简单得多configure.ac …
fcntl()
使用struct flock
结构来定义和检查文件锁.不幸的是,在不同的Unix系统上,这种结构中的字段顺序不同.有没有人知道如何使用autoconf检查它或至少检查结构是否采用特定格式(例如,问题是 - 结构格式是否与Linux格式匹配)?
一位同事提出了将rake用作非ruby项目的构建系统的想法.是否可以扩展rake以补充通常使用autoconf工具集的其他语言?
我正在研究GNU/Linux上的C++项目,我正在寻找一种方法来测试IBM Informix库与Autotools的存在性和可用性 - 即编辑configure.in
.我没有Autotools的经验,所以基本上我从项目configure.in
等人那里学到了.脚本和复制和更改我认为需要更改的位置.我,我一直在改编现有的文字configure.in
.
到目前为止,我一直在成功使用AC_CHECK_LIB
in configure.in
来测试某个库是否存在且是否可用.但这似乎只适用于具有函数的库,而不是类.也就是说,在测试Informix的libifc++.so
库时,这会失败:
AC_CHECK_LIB(ifc++, ITString,
INFORMIX_LIB="-L$INFORMIX_LIB_LOCATION/c++ -lifc++ -L$INFORMIX_LIB_LOCATION -L$INFORMIX_LIB_LOCATION/dmi -L$INFORMIX_LIB_LOCATION/esql -lifdmi -lifsql -lifasf -lifgen -lifos -lifgls -lifglx $INFORMIX_LIB_LOCATION/esql/checkapi.o -lm -ldl -lcrypt -lnsl",
echo "* WARNING: libifc++.so not found!"
INFORMIX_INC=""
INFORMIX_LIB=""
)
Run Code Online (Sandbox Code Playgroud)
我也试过使用其他组合,比如ITString::ITString
等.
我没有在Informix的API中找到"纯"函数(即,在C++类中没有上下文的函数).所以我希望AC_CHECK_LIB
在这种情况下有一种方法可以使用,或者还有另一种autoconf
/ configure.in
"命令"用于此特定用途.
提前感谢您的反馈.
我正在尝试为开源项目调试autotools问题,这在配置步骤失败了.我想看看配置的代码/可执行文件正在尝试运行.
但是,config.log只显示失败的东西(不是它试图编译的代码),我不知道临时可执行文件的存储位置(并且它们可能会被及时删除).
有没有办法让autotools保持其临时文件?在指定的级别无关紧要 - 无论是使用args进行配置,还是在生成configure时使用args到autoconf,或者甚至进行一些m4调用.
编辑当出现故障时,configure.log看起来像这样:
configure:3285: checking whether we are cross compiling
configure:3293: gcc -o conftest.exe -DU_STATIC_IMPLEMENTATION -O3 conftest.c >&5
configure:3297: $? = 0
configure:3304: ./conftest
configure:3308: $? = 1
configure:3315: error: in `/home/bobthebuilder/Development/icu/build':
configure:3317: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details
Run Code Online (Sandbox Code Playgroud) 由于某些原因,我在纯文本文件而不是configure.ac中定义项目版本号.我想创建一个语句来读取版本号并在编译期间存储它.
现在我的configure.ac看起来像这样:
AC_INIT([my program],[999.9.9])
Run Code Online (Sandbox Code Playgroud)
我希望有类似的东西:
AC_INIT([my program],[ $(cat VERSION) ])
Run Code Online (Sandbox Code Playgroud)
这当然不会奏效.这里的诀窍是什么?(我知道我失去了一些便携性 - 我现在不在乎).谢谢!
我有一个项目可以基于一个定义生成两个不同的应用程序.
libfoo_la_CXXFLAGS = -DMYDEFINE
Run Code Online (Sandbox Code Playgroud)
我必须修改Makefile.am来设置这个定义,所以它不是自动的.
我可以通过configure命令以某种方式设置此定义吗?有没有其他方法可以使用autotools设置一个定义?
一般问题:如果我使用交叉编译器,我怎么能告诉我在运行configure时应该给出的"--host"选项的值?
具体:我正在使用arm64 arch的交叉编译器.什么是正确的"--host"值?