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

Posted

技术标签:

【中文标题】我可以在 Windows 中静态链接 ws2_32.lib 吗? c++ MFC【英文标题】:Can I statically link ws2_32.lib in windows? c++ MFC 【发布时间】:2016-02-19 10:36:36 【问题描述】:

我正在尝试使用用 c++ 编写的 GUI 部署单个 .exe 文件。使用微软视觉工作室。

我已经使用 MFC 创建了 GUI,我可以通过将构建选项更改为:

平台工具集 - Visual Studio 2015 - Windows XP (v140_xp) 使用 MFC - 在静态库中使用 MFC 运行时库 - 多线程 (/MT)

这很好用,并为我提供了一个可以在 Windows 7/XP 上从单个 .exe 文件执行的 GUI。

但是,我需要添加套接字支持,因为该程序包含一个 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

有什么想法吗?

【问题讨论】:

“不再编译”是什么意思?如果您收到错误消息,请发布它。 另外,你不能“静态”使用winsock,因为它是一个DLL。 /MD 和 /MT 仅控制 C 运行时链接。这并不意味着可执行文件不可移植; DLL 始终包含在 Windows 中。 你不能静态链接 ws2_32.lib,这也不是你的问题。一方面,所有受支持的 Windows 版本都附带 Windows Sockets 实现。您真正的问题是,您正在混合 CRT 的发布和调试版本。您需要修复构建配置。 winsock 存在于每个“重要”版本的 windows(vista 等)中,您甚至不需要静态链接它。另外,如果您已经在使用 boost,请切换到 boost.asio 【参考方案1】:

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

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

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

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

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

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

【讨论】:

以上是关于我可以在 Windows 中静态链接 ws2_32.lib 吗? c++ MFC的主要内容,如果未能解决你的问题,请参考以下文章

开机时老出现初始化(0xc00000ba)失败

在哪里下载 ws2_32.dll 2.2 版的运行函数 WSPRegisterMemory?

xp系统出现wps.exe-DLL初始化失败,啥文件都打不开,杀毒软件也打不开用不了

socket编程在windows和linux下的区别是啥?

Winsock2.h 与 winsock2.h 和 wsock32.lib 与 ws2_32.lib

Qt:如何告诉 Qmake 在 Visual Studio 项目中包含 ws2_32