2016-04-17 19 views
0

アドバイスは、マルチスレッドのWin32アプリケーション(少なくともMS Visual Studioの場合)では、シングルスレッドのものではなくマルチスレッドのCランタイムライブラリにリンクする必要があります(したがって、LIBC.LIBまたはLIBCP.LIBの代わりにLIBCMT.LIBまたはLIBCPMT.LIB)。私は現在GCCコンパイラでCode :: Blocksを使用していますが、上記のアドバイスが適用できるかどうか、あるいはもしそうならリンク設定を変更する方法がわかりません。 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ランタイムであるMSVCRT.DLLのDLLバージョンを中心に構築されています。 (現在、MSVCRT.DLLはWindowsオペレーティングシステムの一部とみなされていることに注意してください)。マルチスレッド化されているかどうかに関わらず、MinGWランタイムのスタティックライブラリバージョンはありませんので、LIBCMT.LIBまたはLIBC.LIBに相当するものはありません。これはMSVCRT.LIBとリンクするのと同じです。

一方、GCCは独自のC++ランタイムライブラリを使用しています。 TDM-GCCリリースには、静的マルチスレッドバージョンとDLLマルチスレッドバージョンの2つのバージョンがあります。

Visual Studioでマルチスレッドランタイムライブラリを使用することに関して聞いたアドバイスは適用されません。あなたは選択肢がありません。GCCのコンパイルされたプロジェクトは、常にマルチスレッドのランタイムにリンクされます。 (これは現代版のVisual Studioでも当てはまりますが、Visual Studio 2005でシングルスレッドのランタイムのサポートを中止しました。)

+0

ありがとう、とても役に立ちました!ところで、あなたは、その答えをサポートするための参照を提供できますか? – Entropy

+0

@Entropy重要な主張について権威あるものではありません。作成したアプリケーションがMSVCRT.DLLにリンクされていることを確認することはできますが、マルチスレッドのCRTであることを公式に確認するには、オンラインではなくVisual Studio 6ドキュメントのコピーを参照する必要があります。 TDM-GCCのドキュメントはほとんど存在せず、C++ RTの2つのバージョンを提供し、スレッディングについて言及しているが、2つのC++ RTバージョンがマルチスレッドセーフであるとは言い難い。 ://tdm-gcc.tdragon.net/quirks –

+0

残念ながら、このIDEで私のアプリケーションがどのようにリンクされているかを確認する方法がわかりません。何時間もの検索の後にこの質問を投稿したのです。あなたの定義によると、あなたはあなたが話していることを知っているように見えますが、あなたは厳密にその主題に関する権威ではないと仮定しなければなりません。他の情報源へのリンクがあれば、たとえそれが厳密に権限を持っていないとしても、彼らが何を話しているかを知っているように見えるのは役に立ちそうです。ありがとう。 – Entropy

関連する問題