كيفية إنشاء ملف رأس C تلقائيا باستخدام CMake؟

StackOverflow https://stackoverflow.com/questions/637963

  •  10-07-2019
  •  | 
  •  

سؤال

وأنا أبحث عن وسيلة لتوليد ملف رأس تلقائيا. هذا الملف هو واجهة العامة للمكتبة، وأريد أن "ملء" بعض الهياكل والاشياء قبل تجميع.

وعلى سبيل المثال، في رأس الخاص لدي هيكل مع الحقول مفيدة:

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 عند إنشاء نظام بناء من أجل تجنب سوء حجم البنية في الواجهة العمومية عندما أقوم بتغيير البنية في رأس الخاص.

هل كانت مفيدة؟

المحلول

في الواقع، 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}

وهذا يعمل جيد جدا:)

نصائح أخرى

Makeheaders أداة (<أ href = على "HTTP: //www.hwaci كوم / جنوب غرب / mkhdr / makeheaders.html "يختلط =" نوفولو noreferrer "> دليل ).

وأود أن كتابة إكس الذي يخلق الرأس.

وعلى سبيل المثال:

#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
  }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top