4

我正在寻找一种自动生成头文件的方法。这个文件是一个库的公共接口,我想在编译之前“填充”一些结构和东西。

例如,在私有标头中,我有一个包含有用字段的结构:

typedef struct mystuff_attr_t {
  int                      _detachstate;
  mystuff_scope_t          _scope;
  cpu_set_t                _cpuset;
  size_t                   _stacksize;
  void*                    _stackaddr;
} mystuff_attr_t;

我想在公共标头中有这个结构,没有字段,但大小相同(目前手动完成):

typedef struct mystuff_attr_t {
  char _opaque[ 20 ]; 
} mystuff_attr_t;

我希望在创建构建系统时由 CMake 自动生成它,以避免在我更改私有标头中的结构时在公共接口中出现错误大小的结构。

4

3 回答 3

10

事实上,CMake 允许您生成文件(使用configure_file (file.h.in file.h))并检查类型大小(使用check_type_size ("type" header.h)),因此很容易将这两者结合起来以获得适当的公共标头。这是我在 CMakeList.txt 中使用的一段代码:

# Where to search for types :
set (CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/private_type.h)

# Type1 :
check_type_size ("type1_t" MY_SIZEOF_TYPE1_T)

# Generate public header :
configure_file (${CMAKE_CURRENT_SOURCE_DIR}/pub_type.h.in ${CMAKE_CURRENT_BINARY_DIR}/pub_type.h)

# Need to set this back to nothing :
set (CMAKE_EXTRA_INCLUDE_FILES)

在公共标头 pub_type.h.in 中:

#define MY_SIZEOF_TYPE1_T ${MY_SIZEOF_TYPE1_T}

这工作得很好:)

于 2009-04-07T08:45:02.480 回答
4

Makeheaders工具手册)。

于 2010-01-24T10:36:42.283 回答
2

我会编写一个创建标题的exe。

例如:

#include <stdio.h>

#define PUBLIC(TYPE) \
printf( "typedef struct %s { char _opaque[ %d ]; } %s;\n", #TYPE, sizeof(TYPE), #TYPE )

int main()
  {
  // start header stuff

  PUBLIC(mystuff_attr_t);

  // end header stuff
  }
于 2009-03-12T11:03:17.253 回答