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

Posted

技术标签:

【中文标题】在 Code::Blocks IDE 中为 GCC 链接多线程运行时【英文标题】:Linking multithreaded runtimes for GCC in Code::Blocks IDE 【发布时间】:2016-04-17 02:38:03 【问题描述】:

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

任何帮助将不胜感激。

编辑:

感谢蒂姆的回复。我不知道在这个 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;

【问题讨论】:

你能把你的代码和你当前的编译器标志一起发布吗? 【参考方案1】:

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 单线程运行时的支持。)

【讨论】:

非常感谢,这很有帮助!顺便问一下,您能否提供任何参考资料来支持该答案? @Entropy 对重大声明没有任何权威性。您可以验证自己创建的任何应用程序是否与 MSVCRT.DLL 链接,但您需要参考不再在线的 Visual Studio 6 文档的副本,以找到官方声明,说明这是多线程 CRT。 TDM-GCC 的文档几乎不存在,虽然它确实提到它提供了两个版本的 C++RT,并且确实提到了线程,但并没有说这两个 C++RT 版本是多线程安全的:@ 987654321@ 不幸的是,我不知道如何在这个 IDE 中验证我的应用程序与什么相关联——这就是我在搜索了数小时后发布这个问题的原因。根据您的定义,我必须假设您也不是该主题的严格权威,尽管您似乎确实知道自己在说什么。我认为链接到其他似乎也知道他们在说什么的来源会很有帮助,即使它们也不是严格权威的。谢谢。 @Entropy 我想你只需要相信我的话。我不知道有任何消息来源可以直接说明这一点。这是你必须从各种来源推断出来的,比如我在之前的评论中提到的那些。如果这些可验证的事实不足以说服你,那我再多说也没有意义。如果这对您真的很重要,可以考虑切换到另一个编译器,该编译器确实明确了您正在寻找的保证。 这个编译器对我来说已经是最后的手段了,但我相信你的回答。我只是想尽可能确定,仅此而已。感谢您的意见!

以上是关于在 Code::Blocks IDE 中为 GCC 链接多线程运行时的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu下Code Blocks无法运行和Debug的解决方案

Ubuntu Code::Blocks IDE 13.12 汉化

适用于 Windows 的 LLVM C++ IDE

windows 环境下编译 Code::Blocks

code blocks里无法build。有人告诉我要把gcc设成根目录下的\MinGW。但是我完全没明白啥意思

windows下快速配置C/C++语言学习环境