Странное объявление функции файла заголовка C ++

Я читаю некоторый исходный код, который я пытаюсь скомпилировать в привязки Python, когда я пытаюсь swig -c++ -python my_interface.i я получаю странную ошибку.

Я знаю, что исходный код написан на C ++ 11.

 // module.hpp #pragma once namespace module { MODULE_API void getVersion (unsigned &params); } 
// my_interface.i
%module my_api
%{
#include "module.hpp"
%}

%include "module.hpp"

У меня нет доступа к исходным файлам, только заголовки и общая библиотека, которую мы можем назвать modulelib.so .

Кто-нибудь знает, что MODULE_API перед возвращаемым типом функции?

Когда я пытаюсь скомпилировать прямо сейчас, я получаю ошибку module.hpp:29: Error: Syntax error in input(1) Когда я MODULE_API выходные данные переходят к следующему объявлению функции, поскольку все они имеют этот стиль объявления, я удалил бы их всех, но я чувствую, что это что-то сломает.

Прямо сейчас, когда я запускаю swig -v -wall -c++ -python my_interface.i я получаю сообщение об ошибке:

Language subdirectory: python
Search paths:
   ./
   ./swig_lib/python/
   /usr/share/swig3.0/python/
   ./swig_lib/
   /usr/share/swig3.0/
Preprocessing...
Starting language-specific parse...
module.hpp:6: Error: Syntax error in input(1).

Всего 1 ответ


Это общий шаблон для обработки видимости символов. Например, Windows требует, чтобы вы определяли функции с помощью __declspec(dllexport) при компиляции библиотеки (чтобы компоновщик знал, чтобы сделать соответствующие символы видимыми извне), и __declspec(dllimport) при использовании / компоновке библиотеки (поэтому компоновщик знает, что эти символы должны быть импортированы из DLL).

Чтобы избежать необходимости иметь два разных заголовка (один для компиляции, другой для использования библиотеки), используются условные определения:

#ifdef WIN32

  #ifdef MODULE_EXPORTS
    #define MODULE_API __declspec(dllexport)
  #else
    #define MODULE_API __declspec(dllimport)
  #endif

#else
  #define MODULE_API
#endif

Это всего лишь пример. Это не обязательно должен быть MODULE_API . В некоторых проектах используются __attribute__((visibility("default"))) GCC __attribute__((visibility("default"))) и __attribute__((visibility("hidden"))) , но именно в Windows и возникла эта схема, поскольку Windows по умолчанию скрывает символы.


Есть идеи?

10000