2016-04-17 35 views
0

對於多線程Win32應用程序 - 至少對於MS Visual Studio來說,建議遍及互聯網 - 您必須鏈接多線程C運行時庫而不是單線程(所以LIBCMT.LIB或LIBCPMT.LIB而不是LIBC.LIB或LIBCP.LIB)。我目前正在使用Code :: Blocks和GCC編譯器,我不確定上述建議是否適用,或者如果更改了這些鏈接設置。我無法找到IDE中的任何構建設置中列出的上述任何文件。如果我在一個簡單的測試程序中調用「_beginthread」函數,它似乎編譯並運行沒有任何問題,但我不確定這證明了什麼。我可以從新線程調用「printf」函數,輸出顯示在主控制檯窗口中。我不知道這是否是正確的行爲。在Code :: Blocks中鏈接GCC的多線程運行時IDE

任何幫助將不勝感激。

編輯:

感謝蒂姆爲您的迴應。我不知道在這個IDE中找到編譯器標誌的位置 - 這是問題的一部分。另一部分是當我找到他們時我不知道要改變什麼。但這裏是我的簡單測試程序 - 我希望它有幫助:

#include <windows.h> 
#include <process.h> 
#include <stdio.h> 

HANDLE ThreadHandle; 

void RunThreadFunc(void *This) { 
    printf("%s", "Squeak.\n\n"); 
    _endthread(); 
} 

int main() { 
    Sleep(2000); 

    ThreadHandle = (HANDLE) _beginthread(RunThreadFunc, 0, NULL); 

    //printf("%s", "Woo.\n\n"); 

    Sleep(2000); 

    return 0; 
} 
+0

您可以將您的代碼與當前編譯器標誌一起發佈嗎? – Tim

回答

2

Code :: Blocks附帶的GCC版本是TDM-GCC。此版本的GCC使用MinGW C運行時庫,該庫幾乎完全圍繞Visual Studio 6多線程C運行時的DLL版本MSVCRT.DLL構建。 (注意,MSVCRT.DLL現在被認爲是Windows操作系統的一部分。)沒有靜態庫版本的MinGW運行時,無論是否爲多線程,因此沒有等效於LIBCMT.LIB或LIBC.LIB。這與使用MSVCRT.LIB進行鏈接相當。

另一方面,GCC使用它自己的C++運行時庫。 TDM-GCC版本提供了它的兩個版本,一個靜態多線程版本和一個DLL多線程版本。

因此,您聽說的關於在Visual Studio中使用多線程運行時庫的建議不適用。您沒有選擇,您的GCC編譯項目將始終與多線程運行時鏈接。 (請注意,Visual Studio的現代版本也是如此,他們放棄了對使用Visual Studio 2005的單線程運行時的支持。)

+0

非常感謝,這非常有幫助!順便說一句,你能提供任何參考來支持這個答案嗎? – Entropy

+0

@ Entropy對於重要的權利要求沒有任何權威性。您可以驗證自己創建的任何應用程序是否與MSVCRT.DLL鏈接,但是您需要參考Visual Studio 6文檔的副本(不再在線),以查找官方聲明,說明它是多線程CRT。 TDM-GCC的文檔幾乎不存在,雖然它提到它提供了兩個版本的C++ RT,並且提到了線程化,但並不完全說兩個C++ RT版本是多線程安全的:http ://tdm-gcc.tdragon.net/quirks –

+0

不幸的是,我不知道如何驗證我的應用程序在這個IDE中鏈接的 - 這就是爲什麼我經過幾個小時的搜索後發佈這個問題。根據你的定義,我必須假設你並不完全是這個問題的權威,儘管你似乎確實知道你在說什麼。我認爲與其他來源的鏈接也是有幫助的,這些來源似乎也知道他們在談論什麼,即使他們也不是嚴格的權威。謝謝。 – Entropy

相關問題