2016-02-19 149 views
0

我想用C++编写的GUI部署一个.exe文件。使用微软的Visual Studio。我可以在Windows中静态链接ws2_32.lib吗? C++ MFC

我所创建的GUI使用MFC,我可以得到它通过改变构建选项静态编译:

平台工具集 - 的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

任何想法?

+3

“不再编译”是什么意思?如果您收到错误消息,请将其发布。 – ElderBug

+0

此外,您将无法使用winsock'静态',因为它是一个DLL。/MD和/ MT只控制C运行时链接。这并不意味着可执行文件不可移植;该DLL始终包含在Windows中。 – ElderBug

+1

您不能静态链接* ws2_32.lib *,那也不是您的问题。首先,所有受支持的Windows版本都附带Windows套接字实现。你真正的问题是,你正在混合CRT的发布和调试版本。您需要修复您的构建配置。 – IInspectable

回答

0

Visual C++编译器在其创建的每个obj文件中嵌入一个默认库列表。在链接期间,会处理这些默认库指令,并将这些库隐式添加到链接步骤。

这意味着,如果两个OBJ文件,用不同的C运行时编译设置将有被包含在链接时多个C运行时库,这将发生冲突。

通常,正确的解决方案是重建与它将与特定运行时使用,如果使用针对不同的一个可能发生故障的预期编译相同的C-运行系统设置为代码的来源。

但是,你可以简单地通过增加不必要的图书馆“忽略特定的默认库”链接设置为项目部队的决议的情况。

诀窍是知道哪些实际库映射到哪些设置。

MSDN Use Runtime Library列出了可以选择的各种运行时,在您的情况下,您希望排除构建中包含的静态多线程调试运行时,因此需要将libcmtd.lib添加到默认库中以忽略。