奇怪的 C++ header 文件函数声明
Strange C++ header file function declaration
我正在阅读一些我试图编译成 python 绑定的源代码,当我尝试 swig -c++ -python my_interface.i
时,我收到了一个奇怪的错误。
我知道源代码是用C++11写的。
// module.hpp
#pragma once
namespace module
{
MODULE_API void getVersion (unsigned ¶ms);
}
// my_interface.i
%module my_api
%{
#include "module.hpp"
%}
%include "module.hpp"
我无权访问源文件,只有 headers 和我们可以调用的共享库 modulelib.so
。
有人知道函数 return 类型前的 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).
这是处理符号可见性的常用模式。例如,Windows 要求您在 编译 库时使用 __declspec(dllexport)
定义函数(因此链接器知道使相应的符号在外部可见),并且 __declspec(dllimport)
当 using/linking 一个库(所以链接器知道这些符号将从 DLL 导入)。
为了避免必须有两个不同的 headers(一个用于编译,一个用于使用库),使用条件定义:
#ifdef WIN32
#ifdef MODULE_EXPORTS
#define MODULE_API __declspec(dllexport)
#else
#define MODULE_API __declspec(dllimport)
#endif
#else
#define MODULE_API
#endif
这只是一个例子。它根本 没有 成为 MODULE_API
。一些项目使用 GCC 的 __attribute__((visibility("default")))
和 __attribute__((visibility("hidden")))
,但 Windows 是该方案的起源,因为 Windows' default 是 隐藏个符号。
我正在阅读一些我试图编译成 python 绑定的源代码,当我尝试 swig -c++ -python my_interface.i
时,我收到了一个奇怪的错误。
我知道源代码是用C++11写的。
// module.hpp
#pragma once
namespace module
{
MODULE_API void getVersion (unsigned ¶ms);
}
// my_interface.i
%module my_api
%{
#include "module.hpp"
%}
%include "module.hpp"
我无权访问源文件,只有 headers 和我们可以调用的共享库 modulelib.so
。
有人知道函数 return 类型前的 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).
这是处理符号可见性的常用模式。例如,Windows 要求您在 编译 库时使用 __declspec(dllexport)
定义函数(因此链接器知道使相应的符号在外部可见),并且 __declspec(dllimport)
当 using/linking 一个库(所以链接器知道这些符号将从 DLL 导入)。
为了避免必须有两个不同的 headers(一个用于编译,一个用于使用库),使用条件定义:
#ifdef WIN32
#ifdef MODULE_EXPORTS
#define MODULE_API __declspec(dllexport)
#else
#define MODULE_API __declspec(dllimport)
#endif
#else
#define MODULE_API
#endif
这只是一个例子。它根本 没有 成为 MODULE_API
。一些项目使用 GCC 的 __attribute__((visibility("default")))
和 __attribute__((visibility("hidden")))
,但 Windows 是该方案的起源,因为 Windows' default 是 隐藏个符号。