问题标签 [declspec]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
103 浏览

c++ - __declspec(dllexport) 的预处理器定义

是否可以将其定义为预处理器定义?我正在尝试这样做:

这样我就可以为 Mac 和 Windows 构建这个库。有一个功能__declspec(dllexport)在 Windows 上时需要,但在 Mac 上构建时不需要它。所以这就是我尝试做的。

正如我所怀疑的那样,它在构建时给了我一个错误,因为它不喜欢括号,但我已经看到其他人这样做了。见这里这里。有什么我做错了或以其他方式来实现我想要做的事情吗?

编辑:这是我尝试在 Windows 上构建时遇到的错误(尚未在 Mac 上尝试过)。

我使用 mingw gcc 进行编译。

0 投票
0 回答
49 浏览

c++builder - 关于程序导出变量

显卡厂商有优化方案。以下变量是从程序中导出的,程序会在独立显卡上执行。对于新版bcc编译器编译的程序,导出的变量带有下划线前缀,-vu不支持参数。我不知道如何解决这个问题。

bcc32 旧版本

图片

bcc32c 新版本

图片

0 投票
0 回答
31 浏览

c - 使用 __declspec 会导致“错误 C2370 'In1':重新定义;不同的存储类”

我有一个使用 MSVC 创建的 dll。头文件和 .def 文件也存在。这是从 dll (simple.def) 导出的内容:

我有一个简单的应用程序,它试图访问 dll 中的函数和变量(也有 .lib 文件)。MSVC 项目文件提供了必要的文件,并且应用程序可以正确构建。这是应用程序代码:

这段代码似乎工作正常,但是,如果我尝试从 dll 写入任何全局变量(In1、Gain 或 Increment),则会导致崩溃。

经过研究,我意识到我可以让它工作的唯一方法是添加

并从头文件中注释掉这一行:

如果我不评论这一行,那么我会收到以下错误:

错误 C2370 'In1':重新定义;不同的存储类 SimpleTest \SimpleTest.c 8

0 投票
0 回答
118 浏览

c++ - 如果编译静态库,是否会忽略 __declspec(dllexport)?

目前,我正在使用我编写的较旧的静态库,并尝试添加功能以允许将其编译为 .dll(或 .so)。我已经完成并添加了一个宏:

然后遍历并添加DLLEXPORT到所有需要导出或导入的函数和类。

但我想知道这是否真的有必要?因为当我使用 cmake 编译项目add_library(LIB_NAME STATIC SRC_FILES)并同时定义SHAREDandCOMPILING时,它仍然设法使 MinGW Makefiles 成功编译为静态库。

所以我的问题是,这是否有任何标准保证?我浏览了所有我能找到的文档,包括使用 __declspec(dllexport) 从 DLL 导出和Microsoft 文档中的 __declspec() 关键字。但是我在哪里找不到它应该被忽略的地方。

目前一切正常,所以我主要是出于好奇而询问,但我也有点担心,如果这是未定义的行为,那么我应该现在修复它,以免以后更难诊断问题。

0 投票
1 回答
67 浏览

c++ - 从 10.3 项目调用 c++ 函数(bcb6 dll/lib)函数

我遇到了一个非常令人困惑的现象,试图结合嵌套结构指针参数调用定义为 _declspec(dllexport) 的 borland c++ builder 6 dll 的函数。结构声明包含 AnsiString、std::string 和 std::vector 成员,当我从 bcb6 项目调用 dll 时,它确实有效。不幸的是,当我尝试从 Rad Studio 10.3 项目中调用相同的方法并尝试从向量访问成员时,我确实遇到了访问冲突。试图找出问题的根源,我询问了向量的大小: 在 10.3 中调用之前:1 在 bcb6 中调用之后:大值 > 80000

好像是struct被移位了,否则我无法解释这个奇怪值的原因。在循环期间,确实发生了访问冲突:

我确实已经检查了 c++ 编译器对齐,它在两个 IDE 中都设置为四字。

代码是这样的:

该方法定义如下:

向量是这样填充的:

尝试访问 data->PersonData 的向量元素,例如循环中的 data->PersonData.Name(在迭代器的帮助下),我收​​到此类错误消息:地址 BC3F2D3E 的访问冲突。读取地址 00000000。

真正让我感到困惑的是,当我在 RAD Studio 中调试相同的代码(使用迭代器等)时,它确实如此,并且它也确实可以与 bcb6<->bcb6 结合使用。这必须是一些编译器问题,但我没有具体的想法。我在 10.3 中使用经典编译器。

我真的很感激任何建议,因为我不知道可能是什么原因。从结构切换到类有帮助吗?

0 投票
1 回答
75 浏览

c++ - 嵌套类上的 __declspec(dllexport)

代码:

我必须将我的宏 ( MY_API) 添加到 B 类吗?

0 投票
0 回答
46 浏览

c++ - 使用 IDIA SDK 定位函数 - 奇怪的结果

我正在尝试在 .pdb 文件中查找特定函数。最初我编译了一个简单的“hello, world”程序,并使用 IDiaSymbol::get_name 方法分析了函数的名称,但我找不到我的函数。

在此之后,我尝试__declspec(naked) void myFunction(void){}在我的 helloworld.pdb 文件中包含一个函数,以便使用 IDiaSymbol::get_isNaked 方法来定位我的函数,但是,当我这样做时,根本没有打印任何内容 - 意味着其中没有裸函数我的代码。

编辑:在下面包括我的简单 .pdb 程序(是一个“hello world 程序”,现在包含一个简单的 __declspec(naked) 函数):

我对解析符号表的期望:在 *NIX 上解析 ELF 文件时会得到相同的结果 - 包含我为函数编写的实际名称的符号表,例如“.text myFunction”

实际打印出来的内容:许多 Winapi 函数和其他汇编程序创建的函数,可能是由于优化了我的函数。

例子:

符号名称:main
符号
名称:__acrt_thread_attach 符号
名称:_RTC_NumErrors 符号名称:ReadNoFence64
符号名称:__setusermatherr 符号名称:_RTC_SetErrorFuncW符号名称:IsProcessorFeaturePresent 符号
名称:GetLastError符号名称:__acrt_initialize