我有一大堆代码,用/ MT编译(即期望静态链接到CRT)。我需要将它与静态第三方库结合使用,该库使用/ MD构建(即期望动态链接CRT)。
理论上可以将两者连接成一个可执行文件而不重新编译吗?
如果我与/ nodefaultlib:msvcrt链接,我最终会对__imp__wgetenv
之类的内容进行少量未定义的引用。我很想尝试在我自己的代码中实现这些功能,转发到wgetenv
等等。这值得尝试,还是我会直接遇到下一个问题?
不幸的是,我禁止将第三方代码打包成一个单独的DLL的简单方法: - /
答案 0 :(得分:3)
答案 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的简单方法,如上所述。但是,我无法通过这种简单的方式在线找到足够的解释。因此我的两分钱。 以下是我绕过它的方式
现在在我的main.cpp文件中,我包含了这个接口头文件,通过接口对第三方dll进行所有调用。
在将参数传递给接口时必须格外小心。像int,bool等基本变量可以作为值传递。但是,任何类或结构都需要作为const引用传递以避免堆损坏。这适用于偶数字符串。
如果不清楚,请尽快分享更多细节!