问题标签 [tdm-mingw]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
10101 浏览

c++ - 使用 GCC 的 C++ 内联函数 - 为什么是 CALL?

我一直在测试 C++ 中的内联函数调用。

C++ 编程语言中的 Stroustrup 写道:

inline 说明符是对编译器的提示,它应该尝试生成代码 [...] 内联,而不是为函数放置一次代码,然后通过通常的函数调用机制进行调用。

但是,我发现生成的代码根本不是内联的。isquare函数有一个CALL 指令

替代文字

为什么会这样?那我该如何使用内联函数呢?

编辑:使用的命令行选项:

0 投票
1 回答
2136 浏览

c++ - g ++中的fstream链接错误与-std = gnu ++ 0x

我在 Windows 上使用 tdm-mingw g++ 4.4.0 中的 -std=gnu++0x 参数构建了一个应用程序。

它使用了一个 ofstream 对象,当我构建时,它给出了以下链接错误:

使用默认的旧标准时,它可以正确构建。

这是唯一的错误,尝试与 -lstdc++ 链接没有帮助。以前有人经历过吗?我可以得到任何建议吗?

编辑:我正在创建一个这样的 ofstream 对象:

它编译得很好,但没有得到链接。

0 投票
3 回答
11691 浏览

c++ - C++ GCC4.4 warning: array subscript is above array bounds

I recently upgraded to GCC 4.4 (MinGW TDM build) and now the follow code produces these warning:

In member function 'void Console::print(const std::string&)':

warning: array subscript is above array bounds

Here's the code:

Any ideas?


It is the optimizations that are doing it...

Also it appears to be this line which is causing it:


Ah yes, I found it, it is the argument for boost::is_any_of(), by wrapping it in a string() constructor the warning goes away, thank you all for your help :)

0 投票
3 回答
1059 浏览

c++ - 从导出的 dll 函数访问 dll 中的全局数据

我正在使用一些全局数据创建一个 C++ Win32 dll。全局定义了一个 std::map ,并且 dll 中有将数据写入映射的导出函数(当然,在获取写锁之后)。

我的问题是,当我从 dll DllMain 内部调用 write 函数时,它可以正常工作。但是当我从另一个程序加载 dll 并调用将数据写入全局映射的函数时,它给了我这个错误:

有什么可以做的吗?当从 DllMain 调用时,相同的函数可以访问 dll 中的全局数据,但是当从不同的进程调用时,它无法访问全局数据。请指教。

我正在使用 TDM-MinGW gcc 4.4.0 编译器。

编辑: 好的,我已经弄清楚了问题所在,感谢各位的帮助,但问题不在于构造函数问题或无法在全局空间中拥有地图,而是我在 boost::python 中的问题正在使用。我已经对其进行了测试,但是由于我是从 python 或其他东西中调用 dll,所以 urllib2 模块没有被加载到 dll 中。现在我必须看看如何解决它。

0 投票
10 回答
3305 浏览

c++ - GCC: Empty program == 23202 bytes?

I haven't used any flags (I am a newb to gcc) , just the command:

I have used the latest TDM build of GCC on win32. The resulting executable is almost 23KB, way too big for an empty program.

How can I reduce the size of the executable?

0 投票
5 回答
6259 浏览

c - x86、win32 上空程序的 GCC 汇编输出

我编写空程序来惹恼stackoverflow编码器,不是。我只是在探索 gnu 工具链。

现在以下内容对我来说可能太深了,但为了继续空程序传奇,我已经开始检查 C 编译器的输出,即 GNU 所消耗的东西。

测试.c:

gcc -S 测试.c

你能解释一下这里发生了什么吗?这是我理解它的努力。我已经使用了as手册和我的 x86 ASM 知识:

  • .file "test.c"是逻辑文件名的指令。
  • .def:根据文档“开始为符号名称定义调试信息”。什么是符号(函数名/变量?)以及什么样的调试信息?
  • .scl:文档说“存储类可能会标记符号是静态的还是外部的”。这与我从 C 中知道的静态外部相同吗?那'2'是什么?
  • .type:存储参数“作为符号表条目的类型属性”,我不知道。
  • .endef: 没问题。
  • .text:现在这是有问题的,它似乎是一个叫做部分的东西,我已经读过它是代码的地方,但是文档并没有告诉我太多。
  • .globl “使符号对 ld 可见。” ,手册对此很清楚。
  • _main:这可能是我的主要功能的起始地址(?)
  • pushl_: 长(32 位)推送,将 EBP 放入堆栈
  • movl: 32 位移动。伪C:EBP = ESP;
  • andl: 逻辑与。Pseudo-C: ESP = -16 & ESP,我真的不明白这有什么意义。
  • call:将 IP 推入堆栈(因此被调用的过程可以找到返回的路径)并继续原处__main。(什么是__main?)
  • movl:这个零必须是我在代码末尾返回的常量。MOV 将此零放入 EAX。
  • leave: 在 ENTER 指令 (?) 后恢复堆栈。为什么?
  • ret: 回到栈中保存的指令地址

感谢您的帮助!

0 投票
1 回答
5400 浏览

boost - 如何查看 Boost.Build 调用的 g++ 命令行 (1.33.1)

我在挠头,试图弄清楚为什么在我的机器上构建 Boost 库时没有生成导入库。更具体地说,构建 DLL 工作正常,但我以前(即在我重新安装我的机器之前)会正确生成导入库。

一些规格:

  • 提升 1.33.1
  • 适用于 Windows 的 g++ 4.3.3 TDM-1 版本
  • gcc从 MS Dos 命令行提示符使用工具集构建
  • UnxUtils(14-04-03 之后)

调用 bjam.exe 的命令行如下所示:

这以前可以很好地工作并产生所需的文件boost_thread.lib,但现在不行了。我真的不知道发生了什么,我想确切地知道链接器在命令行上收到了什么以及它认为应该如何处理它

谢谢,

卡尔

0 投票
6 回答
3153 浏览

c - 在 Windows 上使用哪个单元测试框架进行 C 开发?

在 Windows XP 上,使用TDM 的 GCC/MinGW32进行基本开发,即带有 gdb 的 gcc 4.4.x。哪个单元测试框架用于测试驱动开发?

显然Check的单元测试还不能在 Windows 上运行。

Unit Testing Frameworks for CUnit Testing C Code中的问题类似,但并非专门针对在 Windows 上使用 gcc 4.4.x。

0 投票
1 回答
21112 浏览

c++ - 链接静态库时内联函数的多重定义

我有一个用 mingw (gcc for Windows) 编译的 C++ 程序。使用包含 gcc 4.4.1 的 mingw 的 TDM 版本。可执行文件链接到两个静态库 (.a) 文件:其中一个是用 C 编写的第三方库;另一个是我编写的 C++ 库,它使用 C 库提供了我自己的 C++ API。

C 库功能的一部分(在我看来是多余的)是在内联函数中实现的。当您使用 C 库的 API 时,您无法避免包含内联函数,但是当我尝试将它们全部链接在一起时,我收到链接错误,说所有内联函数都有多个定义 - 我都有在我的 C++ 包装器库和我没有调用的包装器库中调用,基本上在标头中内联定义的任何内容都已在 C 库和 C++ 库中为它创建了一个函数。

在同一个项目的不同.c或.cpp文件中多次使用include文件时,不会导致多次定义错误;问题只是它为每个库生成一个定义。

编译器如何/为什么在两个库中为这些内联函数生成函数和符号?如何强制它停止在我的代码中生成它们?有没有我可以运行的工具来从 .a 文件中删除重复的函数,或者有一种方法可以让链接器忽略多个定义?

(仅供参考,第三方库确实在其所有标头中包含 #ifdef __cplusplus 和 extern "C" 保护;无论如何,如果这是问题,它不会导致符号的多重定义,它会导致相反的问题,因为符号会未定义或至少不同。)

值得注意的是,如果我链接到第三方 C 库的 DLL,则不会发生链接错误;但是,然后我遇到奇怪的运行时故障,这似乎与我的代码有自己的函数版本有关,它应该从 DLL 调用。(好像编译器正在创建我没有要求的函数的本地版本。)

之前有人问过这个问题的类似版本,但是,我没有在以下任何一个中找到我的情况的答案:

这个问题的答案是海报是多重定义变量,我的问题是内联函数的多重定义: Repeated Multiple Definition Errors from include same header in multiple cpps

这是一个 MSVC 程序,但我使用的是 mingw;另外,这个问题中的发帖者的问题是在标题中的类主体之外定义了一个 C++ 类构造函数,而我的问题是内联的 C 函数: 静态库多重定义问题

这个傻瓜将他所有的 C 代码重命名为 C++ 文件,而他的 C 代码不是 C++ 安全的: 链接时对许多 std:: 函数的多重定义

这个只是想知道为什么违反一个定义规则不是错误: 具有不同定义的内联函数的不可预测的行为

0 投票
1 回答
933 浏览

mingw - MinGW 的 rand_s

我发现该rand_s功能是 CRT 的一部分,在开发我的应用程序时非常有用。但是,据我了解,它在最近的 MinGW 头文件中没有原型。

因此,我要求提供一种全面的方法来提供或制作此类功能的原型。我考虑过使用#ifdef MINGW样式挂钩,但是,如果未来的修订开始对该功能进行原型设计,这可能会失败。

因此,使该功能可用于我的程序以便可以使用 MinGW 编译的最佳方法是什么?