我在构建一个尝试检查 和 是否存在的项目时遇到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
存在?我怀疑这是我的系统特有的东西,因为我正在配置的项目被广泛使用(unix
与 ghc 编译器捆绑在一起的包),并且它曾经可以工作(当我使用 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
谢谢!