我可以在Windows中静态链接ws2_32.lib吗? c ++ MFC

时间:2016-02-19 10:36:37

标签: c++ windows mfc

我尝试使用用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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

这意味着如果使用不同的C-Runtime设置编译了两个obj文件,链接时会包含多个C-Runtime库,这将会发生冲突。

通常,正确的解决方案是使用与编译的代码相同的C-Runtime设置重建源代码,期望它将与特定运行时一起使用,如果用于另一个运行时可能会失败。

但是,您可以通过将不需要的库添加到项目的“忽略特定默认库”链接器设置来强制解决问题。

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

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