Один из способов заключается в том, чтобы ваши функции, требующие потоков, продолжали существовать на встроенной платформе, но возвращали код ошибки в случае их вызова.Таким образом, API остается одинаковым для всех платформ, что очень желательно для кода, использующего вашу библиотеку («Программа»), поскольку Program не нуждается в autoconf-подобных тестах на наличие функций в вашей библиотеке, а может просто использовать ихи использовать уровень исходного кода ifs для определения их функциональности.
int mylib_thread_frenzy(void)
{
#ifdef HAVE_PTHREAD_CREATE
int ret = pthread_create(...);
if (ret < 0)
return -errno;
return 0;
#else
return -ENOSYS;
#endif
}
.
/* Program */
int ret = mylib_thread_frenzy();
if (ret == -ENOSYS) {
/* Hm, castrated platform. Try something else... */
printf("Or just tell the user the platform is too weak.\n");
} else {
printf("World domination acquired\n");
}
В любом случае, не пытайтесь #include «config.h» в mylib.hи также не отправляйте этот config.h, поскольку определения, указанные в вашем config.h, могут конфликтовать с определениями другой библиотеки и / или Программы.
Если вы действительно хотите удалить функции из mylib.h, я думаю, это приходит на ум:
/* mylib.h.in */
#if 0@HAVE_PTHREAD_CREATE@
extern int mylib_pthread_frenzy(void);
#endif
/* configure.ac */
AC_SEARCH_LIBS([pthread_create], [pthread],
[HAVE_PTHREAD_CREATE=1
AC_SUBST([HAVE_PTHREAD_CREATE])
])
AC_CONFIG_FILES([mylib.h.in])
AC_OUTPUT
Мне, однако, не нравится второй подход, потому что он означает, что configure должен перезапускаться всякий раз, когда mylib.h.in изменяется.