在exe文件中编译静态库

3
我有一个dll和exe,两者我都有源代码。
对于这个DLL,我已经完全静态编译,因此我会认为.lib也是静态的。但是,当我在我的C++ VC++ 2008项目中的链接器>输入>其他依赖项下包含该lib时,我将编译模式设置为/MT(多线程)用于exe。
一切都编译成功了,但是当我尝试运行exe时,它要求dll!据我(有限的)理解,这不应该发生。
我应该怎么做?
2个回答

7
你所提到的“编译模式”设置是与你生成的库或可执行文件链接的运行时库的设置。
如果你的项目被设置为生成DLL(检查主项目页面),那么无论你在运行时库设置中放置什么,它仍将生成DLL。我认为你想要做的是改变DLL的主项目页面上的设置,从DLL改为静态库,而不是改变运行时库设置。
完成此操作后,请确保可执行文件和库项目具有相同的运行时库设置(你提到的/MT开关),否则如果链接器尝试在同一可执行文件中匹配两个不同的运行时库,就会出现大量奇怪的错误消息。

嗯...那似乎有道理...我现在正在尝试。 - Alec Gorge
我在将我的makefile从DLL更改为静态库时遇到了问题。 - Alec Gorge
我现在有一个静态库。我将其作为附加依赖项放置,但当我启动它时仍然要求 DLL。 - Alec Gorge
清除所有旧的编译结果,并检查您是否有旧 DLL 的副本,您可能无意中正在链接到该副本。 - Timo Geusch
我刚刚用另外两个简单的项目进行了测试,效果非常好。我认为我的当前项目中有一些过于复杂的东西(它是相当混乱的),所以我会抽时间在这个周末将其全部修复好。 - Alec Gorge

3
使用“静态”DLL创建的.lib文件只是一个导入库,处理与库中所有符号的自动动态链接。 DLL本身(即.dll文件)仍包含您期望的所有代码/符号等。
静态链接到.lib文件只是为了节省手动调用LoadLibrary()/GetProcAddress()等来解析DLL内符号的工作。
除非您构建一个真正的静态库(即具有所有符号和代码,而不仅仅是导入),否则您仍然需要DLL本身。

啊,谢谢解释。现在我只需要重新配置我的项目,将它变成静态库而不是动态链接库。 - Alec Gorge
我将静态库作为依赖项,但它仍然要求 DLL。 - Alec Gorge
听起来你还在构建DLL+静态导入库,而不是静态代码库。在完成静态代码库之前,你无法摆脱DLL。 - Drew Hall
我并没有输出任何东西,只有一个 .lib 文件被生成,并在项目中被引用。就像我之前所说的:我已经用另外两个简单的项目进行了测试,效果非常好。我认为我的当前项目中可能存在一些过于复杂的问题(它是相当混乱的),所以我会抽时间在这个周末将其全部修复。 - Alec Gorge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接