首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C++中构建与运行时版本无关的动态链接库?

如何在C++中构建与运行时版本无关的动态链接库?
EN

Stack Overflow用户
提问于 2011-06-02 02:29:21
回答 8查看 3K关注 0票数 13

我的产品是一个C++库,在Windows上,它是作为dll分发的。它很少使用c运行时(基本的iostream就是这样),所以我确信所有最新版本的CRT都会很好用。

因为我的客户应该使用我的dll构建他的应用程序,所以我不想强加给他任何特定的运行时版本。我希望我的dll绑定到我客户的应用程序正在使用的任何运行时库版本(我可以假设他的CRT将使用动态链接)。毕竟,这不就是动态链接的全部内容吗?这有可能吗?

编辑:将dll链接到静态运行时库也不起作用,因为这样静态运行时(来自dll)和动态运行时(来自客户端应用程序)将混合在一起,这是不好的。

编辑:我主要问的是,我如何告诉运行时加载程序将我的dll链接到应用程序所链接的任何CRT?也许是和载货单有关的东西?更广泛地说,我的问题是如何构建一个行为良好的dll,供客户构建他们自己的应用程序使用?

编辑:多亏了答案中的建议,我已经将所有对std类的引用转移到了我的头文件中的内联函数中,并将我的dll与静态运行时库链接起来。现在看来,它甚至可以在连接不同CRT版本的应用程序中工作。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-06-02 02:53:31

没有真正的方法来确保您的DLL可以与多个运行时一起工作--任何在它们之间进行更改的类型都可能导致不兼容。例如,对象的大小可以改变,或者成员在其中的位置可以改变。在C++中,这种事情的空间非常小。

您能做的最好的事情就是静态地链接到运行时,并确保导出的API被严格限制在您的控制之下--不将std::string传递给函数,不将stdlib类型作为成员,并且不在一个DLL中使用new,在另一个DLL中使用delete。不要为同一对象混合内联和导出函数(包括构造函数/析构函数),因为成员顺序和填充可能会在编译器之间发生变化。pimpl习惯用法在这方面可能会有所帮助。

票数 12
EN

Stack Overflow用户

发布于 2011-06-02 03:03:57

如果您跨DLL边界公开任何C++对象,那么这是完全不可能的。您可以做的(我们使用第三方DLL来完成此操作)是以多种配置(32位/64位、调试/发布、静态/动态运行时、静态/动态库)构建您的库,以满足尽可能多的人的需求。一开始设置可能有点繁琐,但是一旦你完成了所有配置的设置,就需要构建所有的配置了。当然,您还需要考虑针对哪个运行时(vc8、vc9、vc10等)进行构建,因此,如果您想涵盖所有基础,您可能会有相当多的配置。

票数 6
EN

Stack Overflow用户

发布于 2011-06-02 02:51:05

链接你的动态链接库和静态运行时库应该是可行的,除了你必须非常小心内存管理(例如,任何调用你的动态链接库的人都不能释放()或者释放任何由你的动态链接库分配的东西),并且你不能交换标准的C数据结构(例如delete[] *)。(我是否遗漏了什么?)

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

https://stackoverflow.com/questions/6205960

复制
相关文章

相似问题

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