我在构建试图检查shm_open
和shm_unlink
是否存在的项目时遇到问题。 configure.ac的相关行是:
# Avoid adding rt if absent or unneeded
AC_CHECK_LIB(rt, shm_open, [EXTRA_LIBS="$EXTRA_LIBS rt" CFLAGS="$CFLAGS -lrt"])
# needs -lrt on linux
AC_CHECK_FUNCS([shm_open shm_unlink])
AC_CHECK_LIB
行成功,但AC_CHECK_FUNCS
两者都失败。查看config.log
,我看到了
configure:4133: checking for shm_open in -lrt
configure:4158: /usr/bin/gcc -o conftest -fno-stack-protector -Wl,--hash-size=31 -Wl,--reduce-memory-overheads conftest.c -lrt >&5
configure:4158: $? = 0
configure:4167: result: yes
configure:4178: checking for shm_open
configure:4178: /usr/bin/gcc -o conftest -fno-stack-protector -lrt -Wl,--hash-size=31 -Wl,--reduce-memory-overheads conftest.c >&5
/tmp/ccg0yu56.o: In function `main':
conftest.c:(.text+0xa): undefined reference to `shm_open'
collect2: ld returned 1 exit status
两个检查之间的唯一区别似乎是-lrt
参数的位置。当我尝试手动在一个简单文件上运行gcc时,我得到相同的行为,即只有在源文件输入后-lrt
出现时链接才会成功。
那么,我需要做什么configure
才能确定shm_open
和shm_unlink
是否存在?我怀疑这对我的系统是特别的,因为我正在配置的项目被广泛使用(与ghc编译器捆绑在一起的unix
包),并且它曾经工作(当我在不同的时候构建这个包时)使用gcc-4.4.5的系统,它工作,但环境不再可用)。我首选的解决方案是更改系统/环境或配置标志的某种组合,但是如果我可以向上游发送configure.ac
的标准修改,那也是可以接受的。
我尝试过各种CFLAGS和LDFLAGS组合,但-lrt
标志始终出现在输入文件之前,因此检查仍然失败。
我的系统是Ubuntu 12.04(精确)
$gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
$ uname -a
Linux hostname 3.2.0-26-generic #41-Ubuntu SMP Thu Jun 14 17:49:24 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
谢谢!
答案 0 :(得分:0)
宏有完整格式:
AC_CHECK_LIB (library, function, [action-if-found], [action-if-not-found], [other-libraries])
请注意other-libraries
。此选项特别适用于您描述的情况 - 传递-lm
,-lrt
和其他常见人员以避免链接器排序中未解析的引用。
查看文档页面,了解有关AC_CHECK_LIB宏
的更多信息