首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译C程序:动态类型定义导致错误

编译C程序:动态类型定义导致错误
EN

Stack Overflow用户
提问于 2014-04-18 16:43:59
回答 2查看 179关注 0票数 1

最后几天我用C写了一个dovecot插件。我的源代码本身似乎很好,但我目前想知道如何编译它或如何有一个更动态的Makefile。

问题是,每当我试图编译时,我都会得到错误的Error: unknown type name: »uoff_t«

问题是,这种类型是以这种方式在一个引用库中定义的:

代码语言:javascript
复制
#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中,这些变量是根据另一种类型设置的:

代码语言:javascript
复制
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是如何定义的(对于其他参数)。有什么主意吗,还是我漏掉了什么?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-22 19:09:13

显然,我试图做的事情似乎是不可能的。最后,我深入研究了autoconf并重用了dovecot的泛型定义。

不管怎样,谢谢你!

干杯

票数 1
EN

Stack Overflow用户

发布于 2014-04-18 18:41:39

我的第一个想法是,如果它是一个Dovecot插件(我对此一无所知),它不是必须包括Dovecot包括文件吗?

这些包含的文件不是已经通过了并拥有uoff_t类型的所有正确值吗?

所以我要尝试的第一件事就是依赖于Dovecot的定义。

我想另一件事是我偶尔做过的事。在Makefile中复制autoconf测试。但我得警告你它看起来很丑。就像这样:

代码语言:javascript
复制
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的编译器支持。很丑,不是吗。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23158378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档