【问题标题】:How to automatically generate C header file using CMake?如何使用 CMake 自动生成 C 头文件?
【发布时间】:2009-03-12 10:06:41
【问题描述】:

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

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

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 自动生成它,以避免在我更改私有标头中的结构时在公共接口中出现错误大小的结构。

【问题讨论】:

    标签: c header cmake


    【解决方案1】:

    事实上,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}
    

    这很好用:)

    【讨论】:

    • 你应该指定你需要添加的行:include(CheckTypeSize).
    【解决方案2】:

    Makeheaders 工具 (manual)。

    【讨论】:

      【解决方案3】:

      我会编写一个创建标头的 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
        }
      

      【讨论】:

      • 我已经想到了,但我想知道像 cmake 这样的工具是否有一些有用的模块来帮助我做到这一点。顺便说一句,只要是针对unix平台的,我宁愿写一个shell脚本而不是exe。
      • 谢谢。使用 bin 的好处是您可以让编译器为您计算出大小。使用脚本你需要自己做,你可能会弄错。
      猜你喜欢
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2017-11-01
      • 1970-01-01
      相关资源
      最近更新 更多