如何声明__sync_fetch_and_add?

时间:2012-02-23 04:52:52

标签: gcc synchronization autoconf

我正在编写一个可以使用__sync_fetch_and_add的程序。不幸的是我的autoconf脚本使用这个相当简单的测试来搜索它:

AC_CHECK_FUNCS([__sync_fetch_and_add])

生成此错误:

Wsuggest-attribute=noreturnconftest.c:56:1: warning: function declaration isn't a prototype [-Wstrict-prototypes]
conftest.c:56:6: warning: conflicting types for built-in function '__sync_fetch_and_add' [enabled by default]
conftest.c:65:1: warning: function declaration isn't a prototype [-Wstrict-prototypes]
/tmp/ccqPsZz4.o: In function `main':
/home/simsong/domex/src/bulk_extractor/tags/1.2.x/conftest.c:67: undefined reference to `__sync_fetch_and_add'
collect2: ld returned 1 exit status

这太烦人了,因为我想使用这个功能,但是某些平台上的某些人告诉我它没有正确编译。我想要一个原型,但似乎没有原型。

感谢。

1 个答案:

答案 0 :(得分:4)

AC_CHECK_FUNCS在这种情况下不可用,因为重新声明函数 - autoconf执行(char functionthatiwant() / conftest.c中的config.log) - 会不利地覆盖内置函数。你需要以下类似的东西。

AC_MSG_CHECKING([for __sync_fetch_and_add])
AC_LINK_IFELSE(
   [AC_LANG_SOURCE([
    int main(void) { return __sync_fetch_and_add((int *)0, 0); }
   ])],
   [AC_MSG_RESULT([yes])],
   [AC_MSG_RESULT([no])]
)