2013-02-18 26 views
0

我在構建試圖檢查shm_openshm_unlink的存在的項目時遇到問題。 configure.ac的相關線路是:AC_CHECK_FUNCS找不到shm_open

# 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 

謝謝!

+0

現在,我可以用LIBS = -lrt配置解決這個問題。現在留下這個問題,希望能有更好的解決方案出現。 – 2013-02-19 01:20:38

+0

黑客的建議:'' - WLL,''不需要'(iirc)'CFLAGS'? – 2013-02-23 20:05:41

回答

0

宏有充分的形式:

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

請注意other-libraries。這個選項特別適用於你描述的情況 - 通過-lm,-lrt和其他常見的人來避免鏈接器排序中未解決的引用。

瞭解更多信息檢查文檔頁面上AC_CHECK_LIB宏觀

+0

謝謝,但不幸的是這是不夠的。 'AC_CHECK_LIB'因爲它正在測試librt而起作用。以下調用「AC_CHECK_FUNCS」失敗。它被'-lrt'調用,但標誌爲時尚早。 – 2013-02-19 01:18:13