问题标签 [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.
c - 使用 __declspec 会导致“错误 C2370 'In1':重新定义;不同的存储类”
我有一个使用 MSVC 创建的 dll。头文件和 .def 文件也存在。这是从 dll (simple.def) 导出的内容:
我有一个简单的应用程序,它试图访问 dll 中的函数和变量(也有 .lib 文件)。MSVC 项目文件提供了必要的文件,并且应用程序可以正确构建。这是应用程序代码:
这段代码似乎工作正常,但是,如果我尝试从 dll 写入任何全局变量(In1、Gain 或 Increment),则会导致崩溃。
经过研究,我意识到我可以让它工作的唯一方法是添加
并从头文件中注释掉这一行:
如果我不评论这一行,那么我会收到以下错误:
错误 C2370 'In1':重新定义;不同的存储类 SimpleTest \SimpleTest.c 8
c++ - 如果编译静态库,是否会忽略 __declspec(dllexport)?
目前,我正在使用我编写的较旧的静态库,并尝试添加功能以允许将其编译为 .dll(或 .so)。我已经完成并添加了一个宏:
然后遍历并添加DLLEXPORT
到所有需要导出或导入的函数和类。
但我想知道这是否真的有必要?因为当我使用 cmake 编译项目add_library(LIB_NAME STATIC SRC_FILES)
并同时定义SHARED
andCOMPILING
时,它仍然设法使 MinGW Makefiles 成功编译为静态库。
所以我的问题是,这是否有任何标准保证?我浏览了所有我能找到的文档,包括使用 __declspec(dllexport) 从 DLL 导出和Microsoft 文档中的 __declspec() 关键字。但是我在哪里找不到它应该被忽略的地方。
目前一切正常,所以我主要是出于好奇而询问,但我也有点担心,如果这是未定义的行为,那么我应该现在修复它,以免以后更难诊断问题。
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 中使用经典编译器。
我真的很感激任何建议,因为我不知道可能是什么原因。从结构切换到类有帮助吗?
c++ - 嵌套类上的 __declspec(dllexport)
代码:
我必须将我的宏 ( MY_API
) 添加到 B 类吗?
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