【问题标题】:Compiling C program: Dynamical type definition leads to errors编译C程序:动态类型定义导致错误
【发布时间】:2014-04-18 16:43:59
【问题描述】:

最近几天我用 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(对于其他参数)。 有什么想法,还是我遗漏了什么?

提前致谢!

【问题讨论】:

  • 我不确定我是否听懂了你的问题。您是否希望您的 Makefile 指定 UOFF_T_INT 之类的?
  • 正确。很抱歉没有说清楚。将立即改善问题;)

标签: c makefile


【解决方案1】:

显然我试图做的似乎是不可能的。 我最终深入研究了 autoconf 并重用了 dovecot 的通用定义。

还是谢谢!

干杯

【讨论】:

    【解决方案2】:

    我的第一个想法是,如果它是一个 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 的支持。丑是不是。

    【讨论】:

    • 嗨赞,感谢您的意见。不幸的是,我上面发布的代码已经是 Dovecot 的。第一个sn-p是uoff_t在Dovecot的compat.h中的定义,第二个属于对应的configure.in。我想做的是在我的 Makefile 中重建这些检查(例如AC_CHECK_TYPE),并在那里为 compat.h 中的定义设置参数。但我想知道那会是什么样子......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多