Как мне объявить __sync_fetch_and_add? - PullRequest
4 голосов
/ 23 февраля 2012

Я пишу программу, которая может очень много использовать __ 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 Ответ

4 голосов
/ 23 февраля 2012

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])]
)
...