Dll导入/导出
Dll import/export
我继承了一个Linux项目,我需要将其移植到Windows和Visual Studio。我已经设置了与Linux中的情况相同的项目结构,但我发现结构有点奇怪(也许它在Linux中都很好),我相信这就是导致我收到的LNK4217(在函数'function'中导入的本地定义符号'symbol')和C4273 ('function': DLL链接不一致)警告的原因。我想要一些关于如何重组项目或更改代码以避免这些警告的建议。基本上这就是我的内容:
- Dll项目名为Foo
- Dll项目名为Bar(取决于Foo Dll)
我发现奇怪的部分和我认为导致LINK4217和C4273警告的原因是Foo和Bar库都包含类MyClass
的头文件和源文件(警告提到这个类):
//MyClass.h
class BAR_API MyClass
{
//Methods etc.
}
其中BAR_API
在Bar库中定义为__declspec(dllexport)
,而在Foo库中定义为__declspec(dllimport)
,根据:
#ifdef BAR_EXPORTS
#define BAR_API __declspec(dllexport)
#else
#define BAR_API __declspec(dllimport)
#endif
你建议我怎么改变这个?它会帮助移动MyClass到自己的库,并有Foo和Bar包括它或改变,使BAR_API
被定义为什么,而不是__declspec(dllimport)
在Foo库?
让我们看看这里有什么1. 定义MyClass
并导出它的Foo.dll
2. Bar.dll
依赖于Foo.dll
,但也定义了MyClass
——这是混淆链接器的模糊来源。
在我看来,正确的做法是:
- 在
Foo.dll
中定义MyClass
(因为Bar.dll
已经依赖它),在Foo.dll
的MyClass
声明中使用__declspec(dllexport)
导出MyClass
。 -
#include
头文件,声明MyClass
(其中将指定为使用__declspec(dllimport)
导入)在Bar.dll
的.cpp
文件中适当的地方;但是,不包含实现MyClass
的.cpp
文件。
BAR_API
(在本例中应重命名为FOO_API)根据是否定义了BAR_EXPORTS
(在本例中应重命名为FOO_EXPORTS
),将其定义为dllexport
或dllimport
,从而帮助您实现这一点。你应该在Foo项目的每个源文件中设置#define FOO_EXPORTS
,要么通过设置编译器命令行参数,要么通过#包括Foo项目中每个.cpp
文件中的#defines FOO_EXPORTS
的通用头(但不是在Bar项目中)。
这样Foo.dll和Bar.dll都将使用Foo.dll中的MyClass。
HTH
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 尝试导入pybind-opencv模块时出现libgtk错误
- 导入库可以跨dll版本工作吗
- conan有没有办法导出一个空目录
- 将浮动的heightmap数组导出为16位原始值
- 导入/导出变量时出错
- 是否可以将函数导入命名空间,但不能导出它?
- Wasm-LLVM 奇怪的导出/导入名称
- 导出从另一个模块导入的类
- 为什么我无法包含来自 cmake 导出/导入库的头文件
- 如何导入/导出C++模板类
- 当函数通过.def文件导出时,如何使用dllImport导入函数
- 从我的 DLL 导入 C++ 函数不会导出库
- 导出C++ DLL 函数并导入到 C# 中
- ASSIMP 导出导入的场景而不进行任何更改会引发异常
- 为什么将枚举标记为导出/导入会中断氧气生成
- Dll导入/导出
- 静态库.导入和导出内联函数
- 匹配MSVC符号导出名称到Qt Creator导入查找
- 简单的3D动画文件格式需要c++导入/导出