问题标签 [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++ - Windows DLL、导出、模板和链接器问题
我有一个问题。我有一个看起来有点像这样的类结构:
给那些迂腐的人的一些注意事项:
我对公众很松懈:在这个例子的类中为了可读性
在这个例子中,DerivesFrom 做任何有用的事情并不是很明显。但是,在我们的架构中,确实如此,您必须相信它是必要的。
DLL_FLAG 是一个宏,在编译代码时
现在,问题:
在 LibraryA 中,导出了 MyClass 和 MyCommonClass。因为导出了 MyCommonClass,所以也导出了 DerivesFrom(至少在 VS2012 中是这样)。
然后,当 LibraryB 导出 MyClass 时,它也会导出 DerivesFrom (wtf?)。
然后,当我们将 MyExecutable.exe(作为 cmake 定义的构建过程的一部分)链接到 LibraryA.dll 和 LibraryB.dll 时,它会失败,因为有一个重复的 DerivesFrom - 每个库都有一个。
我们以前见过但不能使用的解决方案:
__declspec(dllexport) DerivesFrom 在一个库中并在另一个库中导入。但是,这需要在代码中添加太多实际上不应该存在的废话。然后它强制一个库“托管”该类,但这个概念在我们的系统中没有意义。
“不要那样做。” 好吧,我说 Visual Studio 不应该那样做。或者我们应该能够指定 DerivesFrom(以及 DerivesFrom 的所有实例化)仅应具有内部链接,因此它的符号永远不会被导出。
我不知所措:
为什么 VS2012 会自动导出模板并拒绝让每个库使用自己的。
为什么我不能告诉它永远不要导出这些模板(这可能不可行,因为有时,两个库可能派生自一个包含 DerivesFrom<> 的类)。
如何解决这个问题。
任何想法将不胜感激!
declspec - 警告 C4091:“__declspec(dllexport)”
我有以下代码,我试图从我的 dll 中导出一个名为“Interface_API”的函数。
当我编译这段代码时,它会给出以下警告,并且函数没有被导出。
当我更改下面给出的声明时,我没有收到警告并且它正确导出。
我有点困惑,因为我在不同的 dll 中使用过它,它工作正常。有什么线索吗?
c++ - C++ Visual Studio 2013 奇怪的错误,但代码运行
我正在尝试使用 __declspec 属性并在使用多个索引时遇到一些奇怪的错误。我在 Visual Studio 中收到错误消息:“表达式必须是指向完整对象类型的指针”,但代码似乎运行良好。这是我正在使用的代码:
此示例在使用多维属性的模板类上使用 __declspec 属性。如果我删除一组括号和参数,似乎错误消失并且代码按预期运行。就像现在的代码一样,它会在 Visual Studio 中引发错误并仍在运行。
为什么这是一个问题?我在一个团队中工作,如果出现错误,其他人会不高兴,并且可能会认为代码不起作用,尽管它会。有没有办法抑制此类错误?为什么会这样?
c++ - 构建新库时包括库中的头文件
明确一点:我知道下面的示例演示了 dll 依赖关系,即一个库不是自包含的,而是依赖于另一个库来运行。
假设我正在创建一个运行时库 Utility.dll,其中包含各种有用的通用功能。我创建了一个头文件 Utility.h 以包含在需要使用 Utility.dll 的其他文件中。头文件看起来像
当我将源代码文件 Utility.cpp 编译为机器代码(到 Utility.dll 中)时,我确保定义了 BUILD_DLL,以便将 DLL_EXPORT 替换为 __declspec(dllexport)。这使得函数被导出到 .dll 文件中。每当我包含标头 Utility.h 并与导入库(MS VS 的 Utility.lib,g++ 的 libUtility.a)链接并且不定义 BUILD_DLL 时,Utility.h 中的函数声明都以 __declspec(dllimport) 开头,告诉函数是从 .dll 导入的编译器(可以这么说)。
现在,假设我还在构建另一个库 MyLibrary.dll,它想使用 Utility.dll 中的一些有用功能。同样,我会将 MyLibrary.h 创建为
当我将 MyLibrary.cpp 编译到 MyLibrary.dll 中时,我将包含 Utility.h 并链接到 Utility 导入库。
这引出了我的问题:由于我在编译 MyLibrary.dll 时也定义了 BUILD_DLL,这意味着 Utility.h 中的函数声明也将读取
不是
当我们编译 MyLibrary.dll 时,我们不希望 Utility.h 中的函数声明为 __declspec(dllimport),而 MyLibrary.h 中的函数声明为 __declspec(dllexport) 吗?
c++ - 将静态库与 dll 链接的正确方法
我的项目通过几个静态库构建,这些静态库应该链接到主 dll 库,因此获得了一个 dll。
使用__declspec(dllexport)
属性不会导致静态库的指定功能出现在 dll 中,库根本没有与 dll 链接。
然后我尝试将每个库构建为共享库,以获取导出函数的正确名称并基于它们创建 .def 文件。使用 .def 文件会导致结果。
在我的情况下应该
__declspec(dllexport)
并.def-file
采取同样的行动吗?是否可以从源代码生成 .def 文件?由于我有 C++ 代码,由于 API 中的修饰和存在类,我无法自己编写 .def 文件,因此上述临时生成的 dll 的方法与生产不一致。
更新
我想详细解释一下我的项目的结构。该解决方案由几个项目(模块)组成。
每个子项目都弱依赖于其他子项目,让我们假设它们没有连接以清晰。每个模块都有自己的公共接口。我希望将所有模块都作为单个动态库,所以我的工件是dynamic_lib.dll
,但实际上静态库没有与之链接。
c++ - 使用 __declspec(dllexport) 从类创建对象
我想通过在下面执行此操作来访问此功能。Visual Studio 建议执行“Part::read();” 并且 f12 对该功能有效。
但是在编译时它会抱怨语法错误,因为它认为 PartExport 是类名。如何访问此功能或创建 MyClass 的对象?
编辑:我意识到类上的所有语法错误都来自 #include 。我不知道那是什么意思
c++ - Find the associated dll file to __declspec(dllexport)
I got this massive project with many classes with definitions in dll files. I need to extract a part of this project and create a new project from that part. I have managed to find some dll files by using the Code Map in Visual Studio but some classes are not shown up there.
What is specifying which dll files are linked to what?
c++ - 无法在循环中动态分配内存(函数吃掉所有内存)
当我运行下面的代码时,在循环的第二次迭代中,整个操作系统都会挂起。如果我打开任务管理器,它清楚地表明存在巨大的内存泄漏。在我开始执行代码后,所有内存在 4 秒内就消失了。
这是代码:
当我注释掉代码中的所有内容并只在循环中留下__declspec(align())
声明和delete[]
'for
时,内存泄漏仍然存在,这表明问题实际上出在那些__declspec
s 上。
函数generate_random_1d_matrix
,看起来像这样get_random_float
:main
谁能告诉我这里出了什么问题以及如何解决该内存问题?
更新
更改了提供的代码。我只留下了实际产生问题的部分。
c++ - __declspec(dllimport) c 结构:访问冲突
一段时间以来,我一直试图找到解决以下问题的方法,但没有成功:
- 我有一个“c” dll,其中定义了以下结构:
文件:myDll.h
在我的 c++ 可执行文件中,我包含了 myDll.h 文件并尝试修改 test1 和 test2:
程序正确通过:
但有一次
达到,我得到以下异常:
我真的不知道出了什么问题。也许有人可以给我一个建议?
先感谢您。
c++ - 使用 CryptoPP::RSA 时无法将 AutoSeededRandomPool 作为参数传递,错误 C2729
我正在使用 Crypto++ 实现 RSA。我正在尝试生成一对 RSA 密钥(公共和私有)来像这样归档。
当我把所有的东西都放进去时,代码可以完美运行main
。当我尝试将其拆分为函数并将AutoSeededRandomPool
对象作为参数传递时,如下所示:
在构建项目时,我收到了错误:
错误 C2719: 'rnd': 带有 __declspec(align('8')) 的形式参数不会对齐
我无法从 Google 找到与此错误相关的与 Crypto++ 相关的确切结果,但我找到了错误代码 C2719的一些结果。其内容:
'parameter': 带有 __declspec(align('#')) 的形参不会对齐
函数参数上不允许使用 align __declspec 修饰符。函数参数对齐由使用的调用约定控制。有关详细信息,请参阅调用约定。
以下示例生成 C2719 并显示如何修复它:
我还没有从中得到任何想法,将这个“解决方案”应用到我的案例中。
好像AutoSeededRandomPool
不能作为参数传递。有没有办法解决这个问题?