0

我在构建一个尝试检查 和 是否存在的项目时遇到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_openshm_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

谢谢!

4

1 回答 1

0

宏有完整的形式:

AC_CHECK_LIB (library, function, [action-if-found], [action-if-not-found], [other-libraries])

请注意other-libraries。此选项特别适用于您描述的情况 - pass-lm-lrt其他普通人以避免链接器排序中未解决的引用。

检查文档页面以获取有关AC_CHECK_LIB宏的更多信息

于 2013-02-18T13:57:08.190 回答