我继承了一个Linux项目,需要移植到Windows和Visual。我已经设置了与Linux相同的项目结构,但是我发现这个结构有点奇怪(可能在Linux中是好的),我相信这就是导致我收到的LNK4217 (本地定义的符号‘符号’导入函数‘)和C4273 (’函数‘:不一致的DLL链接)警告的原因。我想要一些关于如何重新构造项目或更改代码以避免这些警告的建议。基本上这就是我所拥有的:
我认为引起LINK4217和C4273警告的部分是,Foo和Bar库都包含类MyClass的头文件和源文件(警告提到这个类):
//MyClass.h
class BAR_API MyClass
{
//Methods etc.
}在Bar库中将BAR_API定义为__declspec(dllexport),而在Foo库中定义为__declspec(dllimport),如下所示:
#ifdef BAR_EXPORTS
#define BAR_API __declspec(dllexport)
#else
#define BAR_API __declspec(dllimport)
#endif你建议我怎么改变这个?将MyClass移动到它自己的库,并让Foo和Bar包含它或进行更改,以便在Foo库中将BAR_API定义为nothing而不是__declspec(dllimport),会有帮助吗?
发布于 2015-08-27 13:59:07
让我们看看这里有什么: 1. Foo.dll,它定义了MyClass,并导出了它2. Bar.dll,它依赖于Foo.dll,但也定义了MyClass --这是混淆链接器的歧义来源。
据我所知,正确的做法是:
Foo.dll中定义Foo.dll(因为Bar.dll已经依赖它)并使用Foo.dll的MyClass声明中的__declspec(dllexport)导出MyClass。#include头文件,该文件在MyClass的.cpp文件中声明MyClass(在该文件中它将被指定为使用__declspec(dllimport)导入);但是,不包括实现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
https://stackoverflow.com/questions/32249825
复制相似问题