在 Code::Blocks IDE 中为 GCC 链接多线程运行时

Linking multithreaded runtimes for GCC in Code::Blocks IDE

互联网上到处都是关于多线程 Win32 应用程序的建议 – 至少对于 MS Visual Studio – 你必须 link 使用多线程 C 运行time 库而不是单个-threaded 一个(所以 LIBCMT.LIB 或 LIBCPMT.LIB 而不是 LIBC.LIB 或 LIBCP.LIB)。我目前正在使用 Code::Blocks 和 GCC 编译器,我不确定上述建议是否适用,或者如果适用的话如何更改这些 link 设置。我在 IDE 的构建设置中的任何地方都找不到上述任何文件。如果我在一个简单的测试程序中调用“_beginthread”函数,它似乎编译 运行 没有任何问题,但我不确定这能证明什么。我可以从新线程调用“printf”函数,输出出现在主控制台 window。我不知道这是不是正确的行为。

如有任何帮助,我们将不胜感激。

编辑:

感谢蒂姆的回复。我不知道在哪里可以找到 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;
}

Code::Blocks 附带的 GCC 版本是 TDM-GCC。此版本的 GCC 使用 MinGW C 运行时库,它几乎完全围绕 Visual Studio6 多线程 C 运行时 MSVCRT.DLL 的 DLL 版本构建。 (请注意,MSVCRT.DLL 现在被认为是 Windows 操作系统的一部分。)MinGW 运行时没有静态库版本,无论是否是多线程的,因此没有等同于 LIBCMT.LIB或 LIBC.LIB。它等同于使用 MSVCRT.LIB 进行链接。

另一方面,GCC 使用它自己的 C++ 运行时库。 TDM-GCC 版本提供了它的两个版本,静态多线程版本和 DLL 多线程版本。

因此,您听到的有关将多线程运行时库与 Visual Studio 结合使用的建议不适用。您别无选择,您的 GCC 编译项目将始终与多线程运行时链接。 (请注意,对于 Visual Studio 的现代版本也是如此,它们在 Visual Studio 2005 中放弃了对单线程运行时的支持。)