【发布时间】:2015-08-27 12:48:10
【问题描述】:
我继承了一个需要移植到 Windows 和 Visual Studio 的 Linux 项目。我已经设置了与 Linux 中相同的项目结构,但我发现结构有点奇怪(也许在 Linux 中一切都很好),我相信这就是导致 LNK4217 的原因(在函数'function 中导入的本地定义的符号'symbol' ') 和 C4273 ('function' : 不一致的 DLL 链接) 警告我收到。我想要一些关于如何重新构建项目或更改代码以避免这些警告的建议。基本上这就是我所拥有的:
- 名为 Foo 的 Dll 项目
- 名为 Bar 的 Dll 项目(取决于 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 定义为空而不是 Foo 库中的 __declspec(dllimport) 是否有帮助?
【问题讨论】:
-
所以 Bar 依赖于 Foo... 但 Foo 使用 Bar 的 MyClass? MyClass 应该定义一次(如果需要,在第三个项目中)。
-
是的,但是由于现在已设置解决方案,因此 Foo 不需要从 Bar 导入,因为它还包含 MyClass 的头文件和源文件。但我猜 Foo 试图导入它,因为 BAR_API 被定义为 __declspec(dllimport)。
-
基本上,我只会在 Foo.dll 项目中保留一个 MyClass 版本(包括头文件和源代码)(应该使用类似的 FOO_API 导出)。然后,您应该包含来自 Bar 的标头并将 Bar 与 Foo.lib(Foo 的导入库)链接。
-
构建 Bar 时会得到 LNK4217,但 BAR_EXPORTS 不是#defined。它看到类的 dllimport 但无论如何都发现了类的定义,这不是很高兴。 C4273 大体相同。