- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 C++Builder 中工作了很长时间后,我正在尝试开始使用 mingw (MinGW-w64) 和 eclipse。我很困惑。
我的工作主要围绕供应商提供的以 MSVC 为中心的 API。它由 3 个头文件和几个库组成。我能够在 C++Builder 中不加改动地使用它们的 header ,但在使用 g++ 时遇到了很多问题。
#define GX_WRAPPER_FUNC __declspec(dllexport)
#define GX_STANDARD_FUNC
#define GX_WRAPPER_CALL _cdecl
#define GX_STANDARD_CALL _stdcall
#define GX_OBJECT_PTR void*
#define GX_VAR
#define GX_CONST const
#define GX_VOID void
#define GX_LONG long
#define GX_DOUBLE double
#define GX_HANDLE long
#define GX_LONG_PTR long*
#define GX_DOUBLE_PTR double*
#define GX_HANDLE_PTR long*
#define GX_ASTR_PTR char*
#define GX_WSTR_PTR wchar_t*
#if defined(GEO_UTF8)
#define GX_STR_PTR GX_ASTR_PTR
#elif defined( _UNICODE)
#define GX_STR_PTR GX_WSTR_PTR
#else
#define GX_STR_PTR GX_ASTR_PTR
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*---------------- Copy_3DN[_public] ----------------*/
GX_WRAPPER_FUNC GX_LONG GX_WRAPPER_CALL
Copy_3DN(GX_VAR GX_OBJECT_PTR,
GX_CONST GX_HANDLE_PTR,
GX_CONST GX_HANDLE_PTR);
GX_STANDARD_FUNC GX_LONG GX_STANDARD_CALL
Std_Copy_3DN(GX_VAR GX_OBJECT_PTR,
GX_CONST GX_HANDLE_PTR,
GX_CONST GX_HANDLE_PTR);
...hundreds more like this
这会产生一大堆“expected initializer before”错误。
通过像这样重新定义前 4 个定义,我取得了一些成功:
#ifdef __GNUC__
#define GX_WRAPPER_FUNC __attribute__ ((dllexport))
#define GX_STANDARD_FUNC
#define GX_WRAPPER_CALL
#define GX_STANDARD_CALL
#else
#define GX_WRAPPER_FUNC __declspec(dllexport)
#define GX_STANDARD_FUNC
#define GX_WRAPPER_CALL _cdecl
#define GX_STANDARD_CALL _stdcall
#endif
但是遇到了会吐
GX_WRAPPER_FUNC GX_LONG GX_WRAPPER_CALL
RegisterResourceTracking_GEO(GX_VAR GX_OBJECT_PTR,
GX_CONST GX_LONG_PTR,
GX_OBJECT_PTR,
void (_stdcall *param3)(void*));
我真的很想在不编辑它们的情况下使用这些 header ,而且我看到一些引用资料表明正确选择 gcc 发行版可能会支持这种语法,但我已经尝试了一些但没有成功。我已经尝试了 MinGW-w64 的 i686 和 x86-64 变体以及 Nuwen 和 TDM。我不关心跨平台问题,因为无论如何主机应用程序只是 Windows,并且出于我自己顽固的原因,我不想放弃并切换到 MSVC。
那么,是否有支持这种语法的 gcc 发行版?如果不是,阻力最小的路径是什么?
干杯
最佳答案
作为解决方法,您可以扩展您的宏定义集以涵盖 gcc 无法识别的关键字:
#ifdef __GNUC__
#define _cdecl __attribute__((cdecl))
#define __cdecl __attribute__((cdecl))
#define _stdcall __attribute__((stdcall))
#define __stdcall __attribute__((stdcall))
#define GX_WRAPPER_FUNC __attribute__ ((dllexport))
#else
#define GX_WRAPPER_FUNC __declspec(dllexport)
#endif
作为奖励,这些使这里的原始定义有效:
#define GX_STANDARD_FUNC
#define GX_WRAPPER_CALL _cdecl
#define GX_STANDARD_CALL _stdcall
(FWIW,请注意,这是可能的,因为大多数 MSVC 扩展都是新的简单关键字,从保留的标识符空间到实现。gcc 的多标记 __attribute__(())
魔法使映射在相反的方向是完全不可能的。所以任何时候你使用 gcc 不可移植的特性编写代码时,将它们隐藏在宏后面。)
关于c++ - 哪个 gcc 发行版支持 __declspec(dllexport) _cdecl 和 _stdcall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35207170/
__declspec(restrict) 和 __declspec(noalias) 有什么区别我已阅读此页 https://msdn.microsoft.com/en-us/library/k649
我正在尝试使用 macOS mojave 上的终端从 c++ 使用 NDK 将函数导出到共享对象 (.so)。我已经安装了最新版本的命令行工具和 Xcode。 这是我要导出的 GetNumber()
在 C++ 中,我对将指针变量声明为只读感兴趣,我正在考虑通过以下机制来实现: #pragma section (".readonly", read) __declspec(allocate(".re
我应该使用 bool __declspec(dllexport) function() { return true; } 或 __declspec(dllexport) bool functi
代码: #ifdef BUILD_DLL #define MY_API __declspec(dllexport) #else #define MY_API __declspec(dllimport)
您好,我对 dllexport 有点困惑。例如,当我在类里面使用 __declspec( dllexport ) 时 #define DllExport __declspec( dllexpor
我试图了解动态链接的工作原理,并且我了解其中的大部分内容,但是现在编译器或链接器如何知道我究竟从哪个 dll 导入? 例如我有 test_program.dll导出一个名为 test(); 的函数我用
基于 MSDN,__declspec(align(x)) 应该在成员变量之后添加 x 位填充,例如: #include using namespace std; void main() {
我试图通过导出为 DLL(在 Windows/VS 2010 上)来保护一些 C++ 代码。 在下面的示例中,var 在父类(super class)构造函数中设置,并且调试器显示它肯定设置为引用某物
如果我有 SOME_MACRO 定义为 __declspec(dllimport) 或 __declspec(dllexport),有没有办法检查编译时用的是哪一个? 即像这样: #if SOME_M
我们知道,novtable 表示不为纯抽象类创建虚表。但是当我运行代码时,出现了错误: #include using namespace std; struct A{ virtual voi
是的,我已经阅读了这个:http://msdn.microsoft.com/en-us/library/83ythb65.aspx但我不清楚。首先,__declspec(align(#)) 使用它声明
我在看这个:Importing Function Calls Using __declspec(dllimport)而且我不明白为什么真的需要 __declspec(dllimport)?为什么链接器
我想在我的一些返回对象引用的成员函数上应用 __declspec(nothrow)。例如,我想将它添加到此函数(在 MyClass.h 中): CMyClass& operator= ( IN UIn
我想构建 2 个 dll,我们称它们为 Foo 和 Bar。我希望 Bar 从 Foo 导入一些类。 Foo.h: #ifdef EXPORT #define DECL __declspec(dlle
为什么会出现以下行为?这是错误还是正常行为? (已使用 Visual Studio 2013 和 2017 进行检查)似乎使用虚函数作为 getter 或 setter 可能无法按预期工作! clas
很抱歉,这个问题非常简单,无法通过 google 找到答案。 这个声明语法是: __declspec(align(16)) float rF[4]; __declspec(align(16)) flo
我正在研究库的多线程实现。在这个库的一个模块中有一些全局变量(在程序执行中经常使用)。为了使对这些变量的访问更加安全,我使用线程本地存储 (TLS) 关键字 __declspec(thread) 来声
我正在考虑将为 Windows 编写的脚本引擎移植到 Linux;它适用于 Winamp 的可视化平台 AVS。我不确定目前是否有可能。据我所知,代码正在获取 C 函数 nseel_asm_atan
http://msdn.microsoft.com/en-us/library/9h658af8.aspx MSDN 说我可以使用 __declspec(dllexport) 从库中导出函数,但是如何
我是一名优秀的程序员,十分优秀!