2016-02-19 147 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添加到默認庫中以忽略。