2009-12-14 106 views
3

我有一个DLL和一个EXE,我都有源码。编译exe文件中的静态库

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

一切编译,但是当我尝试运行exe文件,它要求的dll!就我的(有限)理解而言,这不应该发生。

我为什么要这样做?

回答

7

的“编译模式”的设置,你指的是为获取与任何库链接或可执行你生产的运行时库的设置。

如果你的项目设置为产生DLL(检查项目主页),那么它仍然会产生一个DLL,不管你把什么到运行时库设置。我想认为你想要做的是将DLL的主项目页面上的设置从DLL更改为静态库,而不是更改运行时库设置。

完成此操作后,请确保可执行文件和库项目具有相同的运行时库设置(您引用的/ MT开关),否则如果链接程序为试图在同一个可执行文件中匹配两个不同的运行时库。

+0

嗯...这似乎是有道理的...我现在正在尝试。 – 2009-12-14 22:30:29

+0

我无法将我的生成文件从DLL更改为静态库。 – 2009-12-14 23:43:36

+0

我现在有一个静态库。我把它作为一个额外的依赖,并且当它启动时它仍然要求DLL。 – 2009-12-15 01:57:04

3

是与“静态” DLL创建的.lib文件就是这样处理的自动动态链接到库中的所有符号导入库。 DLL本身(即.dll文件)仍包含所有代码/符号/等。你期望的。

静态链接到的.lib文件只是保存你手动调用LoadLibrary()/ GetProcAddress的()等来解决DLL中的符号。

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

+0

啊。感谢您的解释。现在我只需要重新配置我的项目是一个静态库而不是一个DLL。 – 2009-12-14 22:35:51

+0

我把静态库作为一个依赖项,它仍然要求DLL。 – 2009-12-15 02:04:24

+0

@Ramblingwood:听起来你还在构建一个DLL +静态导入库,而不是静态代码库。直到你这样做,你将无法摆脱DLL。 – 2009-12-15 02:55:59