首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dll导入/导出

Dll导入/导出
EN

Stack Overflow用户
提问于 2015-08-27 12:48:10
回答 1查看 1.4K关注 0票数 1

我继承了一个Linux项目,需要移植到Windows和Visual。我已经设置了与Linux相同的项目结构,但是我发现这个结构有点奇怪(可能在Linux中是好的),我相信这就是导致我收到的LNK4217 (本地定义的符号‘符号’导入函数‘)和C4273 (’函数‘:不一致的DLL链接)警告的原因。我想要一些关于如何重新构造项目或更改代码以避免这些警告的建议。基本上这就是我所拥有的:

  • 名为Foo的Dll项目
  • 名为Bar的Dll项目(取决于Foo dll)

我认为引起LINK4217和C4273警告的部分是,Foo和Bar库都包含类MyClass的头文件和源文件(警告提到这个类):

代码语言:javascript
复制
//MyClass.h
class BAR_API MyClass
{
    //Methods etc.
}

在Bar库中将BAR_API定义为__declspec(dllexport),而在Foo库中定义为__declspec(dllimport),如下所示:

代码语言:javascript
复制
#ifdef BAR_EXPORTS
#define BAR_API __declspec(dllexport)
#else
#define BAR_API __declspec(dllimport)
#endif

你建议我怎么改变这个?将MyClass移动到它自己的库,并让Foo和Bar包含它或进行更改,以便在Foo库中将BAR_API定义为nothing而不是__declspec(dllimport),会有帮助吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-27 13:59:07

让我们看看这里有什么: 1. Foo.dll,它定义了MyClass,并导出了它2. Bar.dll,它依赖于Foo.dll,但也定义了MyClass --这是混淆链接器的歧义来源。

据我所知,正确的做法是:

  1. Foo.dll中定义Foo.dll(因为Bar.dll已经依赖它)并使用Foo.dllMyClass声明中的__declspec(dllexport)导出MyClass
  2. #include头文件,该文件在MyClass.cpp文件中声明MyClass(在该文件中它将被指定为使用__declspec(dllimport)导入);但是,不包括实现MyClass.cpp文件。

BAR_API (在本例中应该重命名为FOO_API)帮助您根据BAR_EXPORTS (在本例中应该重命名为FOO_EXPORTS)是否定义为dllexportdllimport来实现这一点。您应该在Foo项目的每个源文件中设置#define FOO_EXPORTS,或者设置编译器命令行参数,或者通过#包括Foo项目中每个.cpp文件中的#defines FOO_EXPORTS的公共头(但不是在Bar项目中)。

这样,Foo.dll和Bar.dll都将使用Foo.dll中的MyClass。

HTH

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32249825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档