我在最后几天用C写了一个dovecot插件。我的源代码本身似乎很好,但我现在想知道如何编译它或如何使用更具动态性的Makefile。
问题是,每当我尝试编译时,都会收到错误Error: unknown type name: »uoff_t«
问题是,这种类型是以这种方式在一个引用的库中定义的:
#if defined (HAVE_UOFF_T)
/* native support */
#elif defined (UOFF_T_INT)
typedef unsigned int uoff_t;
#elif defined (UOFF_T_LONG)
typedef unsigned long uoff_t;
#elif defined (UOFF_T_LONG_LONG)
typedef unsigned long long uoff_t;
#else
# error uoff_t size not set
#endif
在dovecot的Autoconf中,这些变量是根据另一种类型设置的:
AC_CHECK_TYPE(uoff_t, [
have_uoff_t=yes
AC_DEFINE(HAVE_UOFF_T,, Define if you have a native uoff_t type)
], [
have_uoff_t=no
])
AC_TYPEOF(off_t, long int long-long)
case "$typeof_off_t" in
int)
offt_max=INT_MAX
uofft_fmt="u"
if test "$have_uoff_t" != "yes"; then
AC_DEFINE(UOFF_T_INT,, Define if off_t is int)
fi
offt_bits=`expr 8 \* $ac_cv_sizeof_int`
;;
long)
offt_max=LONG_MAX
uofft_fmt="lu"
if test "$have_uoff_t" != "yes"; then
AC_DEFINE(UOFF_T_LONG,, Define if off_t is long)
fi
offt_bits=`expr 8 \* $ac_cv_sizeof_long`
;;
"long long")
offt_max=LLONG_MAX
uofft_fmt="llu"
if test "$have_uoff_t" != "yes"; then
AC_DEFINE(UOFF_T_LONG_LONG,, Define if off_t is long long)
fi
offt_bits=`expr 8 \* $ac_cv_sizeof_long_long`
;;
*)
AC_MSG_ERROR([Unsupported off_t type])
;;
esac
所以我的问题是,在不使用Automake的情况下,我是否可以在Makefile中以相同的方式使用这些东西。
我的目标是检查uoff_t是否已在某处定义(对于HAVE_UOFF_T)或如何定义类型off_t(对于其他参数)。 任何想法,或者我错过了什么?
提前致谢!
答案 0 :(得分:1)
显然我试图做的事似乎不可能。 我最终将自己挖进了autoconf并重新使用了dovecot的通用定义。
非常感谢!
干杯
答案 1 :(得分:0)
我的第一个想法是,如果它是一个Dovecot插件(我对此一无所知),它是否必须包含Dovecot包含文件?
这些包含文件是否已通过Dovecot autoconf并且具有uoff_t类型的所有正确值?
所以我要尝试的第一件事就是依靠Dovecot的定义。
我想另外要做的事情是我偶尔做过的事情。在Makefile中重现autoconf测试。但我必须警告你,它往往看起来很丑陋。有点像这样:
TESTOPTTMP:=$(shell mkdir -p tmp; mktemp tmp/test_opt_XXXXXXXXXX)
CFLAGS += $(shell (echo '\#include <pthread.h>'; echo '__thread int global; int main() { global = 1; return 0; }') | gcc -x c -D_GNU_SOURCE -pthread -o $(TESTOPTTMP) - >>/dev/stderr 2>&1; $(TESTOPTTMP) && echo '-DHAVE_TLS'; rm -f $(TESTOPTTMP))
那是为了测试__thread
的编译器支持。丑陋,不是。