在exe中编译静态库

时间:2009-12-14 22:19:45

标签: c++ c dll linker

我有一个dll和一个exe,我有两个来源。

对于DLL我已完全静态编译,因此,我认为.lib也是静态的。但是,当我在链接器>下的C ++ VC ++ 2008项目中包含lib时输入>额外的依赖关系。我将编译模式设置为/ MT(多线程)为exe。

所有内容都会编译,但是当我尝试运行exe时,它会询问dll!在我(有限的)理解中,这不应该发生。

我为什么要这样做?

2 个答案:

答案 0 :(得分:7)

您所指的“编译模式”设置是与您生成的任何库或可执行文件链接的运行时库的设置。

如果您的项目设置为生成DLL(检查主项目页面),那么无论您将哪些内容放入运行时库设置,它仍将生成DLL。我想要做的是想要做的是将DLL的主项目页面上的设置从DLL更改为静态库,而不是更改运行时库设置。

完成此操作后,请确保可执行文件和库项目具有相同的运行时库设置(您引用的/ MT开关),否则如果链接器正在尝试,您将收到大量奇怪的错误消息在同一个可执行文件中匹配两个不同的运行时库。

答案 1 :(得分:3)

使用“静态”DLL创建的.lib文件只是一个导入库,可以自动动态链接到库中的所有符号。 DLL本身(即.dll文件)仍然包含所有代码/符号/等。你期待的。

静态链接到.lib文件只会使您无法手动调用LoadLibrary()/ GetProcAddress()等来解析DLL中的符号。

除非你构建一个真正的静态库(即包含所有符号和代码,而不仅仅是导入),否则你仍然需要DLL本身。