混合使用/ MT和/ MD编译的代码

时间:2010-08-12 16:25:22

标签: visual-c++ build msvcrt

我有一大堆代码,用/ MT编译(即期望静态链接到CRT)。我需要将它与静态第三方库结合使用,该库使用/ MD构建(即期望动态链接CRT)。

理论上可以将两者连接成一个可执行文件而不重新编译吗?

如果我与/ nodefaultlib:msvcrt链接,我最终会对__imp__wgetenv之类的内容进行少量未定义的引用。我很想尝试在我自己的代码中实现这些功能,转发到wgetenv等等。这值得尝试,还是我会直接遇到下一个问题?

不幸的是,我禁止将第三方代码打包成一个单独的DLL的简单方法: - /

3 个答案:

答案 0 :(得分:3)

没有。 / MT和/ MD是互斥的。

  

传递给链接器的给定调用的所有模块必须使用相同的运行时库编译器选项编译( / MD / MT / LD )。

Source

答案 1 :(得分:1)

我在OpenSSL源代码中找到了这样的解决方案:库的所有obj文件都使用组合编译:/MT /Zl。正如作者所描述的,这种组合允许构建静态库,能够使用动态CRT(Student: StudentId: 1 StudentName: X List<Course> Courses: [0] - { CourseId: C1, CourseName = Cse1, CourseDuration = 2} [1] - { CourseId: C2, CourseName = Cse2, CourseDuration = 1} [2] - { CourseId: C3, CourseName = Cse3, CourseDuration = 3} Student: StudentId: 2 StudentName: Y List<Course> Courses: [0] - { CourseId: C1, CourseName = Cse1, CourseDuration = 2} [1] - { CourseId: C4, CourseName = Cse4, CourseDuration = 5} )或静态CRT(/MD)编译应用程序。

答案 2 :(得分:0)

我遇到了类似的情况,我有两个库,一个用MT构建,另一个用MD构建。我必须构建一个可执行文件,它使用两个库的功能。作为MD构建的库是第三方,因此我无法重建它,并且构建为MT的库具有许多依赖性并且构建所有它们作为MD是一个巨大的痛苦。我从第三方配置头文件中得到错误,这使得必须将可执行文件构建为MD。我正在寻找将第三方dll打包成一个单独的dll的简单方法,如上所述。但是,我无法通过这种简单的方式在线找到足够的解释。因此我的两分钱。 以下是我绕过它的方式

  1. 我构建了另一个充当接口的.dll。这个界面基本上包含了对第三方dll进行的所有api调用。此接口的头文件不包含来自第三方DLL的任何头文件,而是所有这些头文件都包含在interface.cpp文件中。您期望的界面是作为MD构建的。
  2. 现在在我的main.cpp文件中,我包含了这个接口头文件,通过接口对第三方dll进行所有调用。

  3. 在将参数传递给接口时必须格外小心。像int,bool等基本变量可以作为值传递。但是,任何类或结构都需要作为const引用传递以避免堆损坏。这适用于偶数字符串。

  4. 如果不清楚,请尽快分享更多细节!