使用MinGW时出现C++过程入口点未找到的问题

6

我刚开始学习C++课程,使用MinGW编译(因为之前已经设置好了C语言的K&R)。每当我编译包含或使用任何库的文件时,都会出现以下错误:

"The procedure entry point ...(这只是一堆看起来很混乱的东西)could not be located in the dynamic link library ...(我正在编译的文件的路径)"

在谷歌上搜索后,我尝试将libstdc++-6.dll放置于C:\Windows\System32中,将C:\MinGW\bin置于PATH的首位,并将libstdc++-6.dll放置于我正在编译的.cpp文件所在的同一文件夹中。

唯一的解决方案是将它复制到我正在编译的.cpp文件所在的文件夹中,但我希望避免在未来每次都这样做。

感谢您提前的帮助!


3
在编译器标志中添加“-static-libgcc -static-libstdc++”。 - HolyBlackCat
谢谢!你能解释一下刚才的操作是做了什么吗? - itamar reif
2
这些标志使GCC将标准库(分别用于C和C ++)静态链接而不是动态链接。也就是说,来自“.dll”的内容现在位于“.exe”内(它可能增加了几兆字节的大小)。 - HolyBlackCat
哦,好的!再次感谢!有什么方法可以避免每次都静态链接它吗? - itamar reif
1
不需要,除非你想将 .dll 文件复制到含有你的 .exe 文件的文件夹中。我假设你是从命令行编译的,所以建议你找一个合适的集成开发环境(IDE)。这样你就不必担心你的标志列表有多长了。 - HolyBlackCat
好的,非常感谢你! - itamar reif
1个回答

4
当使用MinGW构建时,生成的二进制文件将需要 libstdc++-6.dll(以及其他一些类似 libwinpthread-1.dll 的文件),它们包含标准 C++ 库,如 std::string 等。
在执行您的二进制文件时,它会在特定位置查找这些 DLL。通常,错误是关于缺少 DLL,但在您的情况下,似乎在您电脑的某个地方安装了一个错误版本的这些 DLL 而您并不知道。(例如 32 位与 64 位)
有两种可能的解决方案:
  • 找到随 MinGW 工具链一起提供的 正确的 DLL 并将它们放置在 本地目录中。(本地目录是可执行文件搜索 DLL 的第一个位置。)您必须将它们的副本和您的构建一起分发。
  • 静态链接标准 C++ 库到您的程序中,方法是向链接器传递 -static-libgcc -static-libstdc++。 这将增加二进制文件的大小,并且每个二进制文件都将包含相同例程的冗余副本。 不过,您将得到一个自包含的二进制文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接