我尝试使用用c ++编写的GUI部署单个.exe文件。使用microsoft visual studio。
我已经使用MFC创建了GUI,我可以通过将构建选项更改为静态来构建它:
平台工具集 - Visual Studio 2015 - Windows XP(v140_xp) 使用MFC - 在静态库中使用MFC 运行时库 - 多线程(/ MT)
这很好用,并且给了我一个GUI,我可以在一个.exe文件中在Windows 7 / XP上执行。
但是,我需要添加套接字支持,因为该程序包含一个IRC客户端。因此,我需要包含库:
#include "stdafx.h"
#include <stdio.h>
#include <string>
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <boost/tokenizer.hpp>
然而,当我这样做时,它将不再编译: 运行时库 - 多线程(/ MT) 相反,它需要: 运行时库 - 多线程调试(/ MTd)
这意味着它不再是便携式.exe
有什么想法吗?
答案 0 :(得分:0)
Visual C ++编译器在它创建的每个obj文件中嵌入一个默认库列表。在链接期间,将处理这些默认库指令,并将库隐式添加到链接步骤。
这意味着如果使用不同的C-Runtime设置编译了两个obj文件,链接时会包含多个C-Runtime库,这将会发生冲突。
通常,正确的解决方案是使用与编译的代码相同的C-Runtime设置重建源代码,期望它将与特定运行时一起使用,如果用于另一个运行时可能会失败。
但是,您可以通过将不需要的库添加到项目的“忽略特定默认库”链接器设置来强制解决问题。
诀窍是知道哪些实际库映射到哪些设置。
MSDN Use Runtime Library列出了可以选择的各种运行时,在您的情况下,您希望排除静态多线程调试运行时包含在构建中,因此需要将libcmtd.lib
添加到默认值要忽略的库。