我的产品是一个C++库,在Windows上,它是作为dll分发的。它很少使用c运行时(基本的iostream就是这样),所以我确信所有最新版本的CRT都会很好用。
因为我的客户应该使用我的dll构建他的应用程序,所以我不想强加给他任何特定的运行时版本。我希望我的dll绑定到我客户的应用程序正在使用的任何运行时库版本(我可以假设他的CRT将使用动态链接)。毕竟,这不就是动态链接的全部内容吗?这有可能吗?
编辑:将dll链接到静态运行时库也不起作用,因为这样静态运行时(来自dll)和动态运行时(来自客户端应用程序)将混合在一起,这是不好的。
编辑:我主要问的是,我如何告诉运行时加载程序将我的dll链接到应用程序所链接的任何CRT?也许是和载货单有关的东西?更广泛地说,我的问题是如何构建一个行为良好的dll,供客户构建他们自己的应用程序使用?
编辑:多亏了答案中的建议,我已经将所有对std类的引用转移到了我的头文件中的内联函数中,并将我的dll与静态运行时库链接起来。现在看来,它甚至可以在连接不同CRT版本的应用程序中工作。
发布于 2011-06-02 02:53:31
没有真正的方法来确保您的DLL可以与多个运行时一起工作--任何在它们之间进行更改的类型都可能导致不兼容。例如,对象的大小可以改变,或者成员在其中的位置可以改变。在C++中,这种事情的空间非常小。
您能做的最好的事情就是静态地链接到运行时,并确保导出的API被严格限制在您的控制之下--不将std::string传递给函数,不将stdlib类型作为成员,并且不在一个DLL中使用new,在另一个DLL中使用delete。不要为同一对象混合内联和导出函数(包括构造函数/析构函数),因为成员顺序和填充可能会在编译器之间发生变化。pimpl习惯用法在这方面可能会有所帮助。
发布于 2011-06-02 03:03:57
如果您跨DLL边界公开任何C++对象,那么这是完全不可能的。您可以做的(我们使用第三方DLL来完成此操作)是以多种配置(32位/64位、调试/发布、静态/动态运行时、静态/动态库)构建您的库,以满足尽可能多的人的需求。一开始设置可能有点繁琐,但是一旦你完成了所有配置的设置,就需要构建所有的配置了。当然,您还需要考虑针对哪个运行时(vc8、vc9、vc10等)进行构建,因此,如果您想涵盖所有基础,您可能会有相当多的配置。
发布于 2011-06-02 02:51:05
链接你的动态链接库和静态运行时库应该是可行的,除了你必须非常小心内存管理(例如,任何调用你的动态链接库的人都不能释放()或者释放任何由你的动态链接库分配的东西),并且你不能交换标准的C数据结构(例如delete[] *)。(我是否遗漏了什么?)
https://stackoverflow.com/questions/6205960
复制相似问题