我可以在窗口中静态链接ws2_32.lib吗?C++ MFC

Can I statically link ws2_32.lib in windows? c++ MFC

本文关键字:lib MFC C++ ws2 窗口 静态 链接 我可以      更新时间:2023-10-16

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

我已经使用 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

有什么想法吗?

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

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

通常,正确的解决方案是使用与编译的代码相同的 C 运行时设置重新生成源代码,如果针对不同的运行时使用,则编译的代码预期将与特定运行时一起使用可能会失败。

但是,只需将不需要的库添加到项目的"忽略特定默认库"链接器设置中,即可强制解决这种情况。

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

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