一种方法是让需要线程的函数继续存在于嵌入式平台上,但在调用它们时返回错误代码。这样,API 跨平台保持相同,这对于使用您的库(“程序”)的代码来说是非常可取的,因为程序不需要类似 autoconf 的测试来测试您的库中是否存在函数,但可以使用它们并利用源代码级别的 if 来确定它们的功能。
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");
}
在任何情况下,都不要尝试在 mylib.h 中 #include "config.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 更改时重新运行。