我有一段代码如下所示.让我们说它在一个名为的文件中example.cpp
#include <fstream>
#include <string> // line added after edit for clarity
int main() {
std::string filename = "input.txt";
std::ifstream in(filename);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Windows上,如果我输入cmd命令g++ example.cpp,它将失败.这是一个很长的错误列表,我认为主要是由于链接器抱怨无法转换string为const char*.
但是如果我使用像这样的附加参数运行编译器:g++ -std=c++17 example.cpp它将编译并正常工作而没有任何问题.
当我运行前命令时会发生什么?我猜测C++编译器的默认版本标准被调用,但我不知道哪个?作为程序员/开发人员,我应该总是使用后一个命令和额外的参数吗?
我经常遇到类似的情况:我有一堆COM .DLL(没有IDL文件),我需要使用它并调用它们来访问一些外来的(非开放的,未记录的)数据格式.
Microsoft的Visual Studio平台具有非常好的功能,可以导入这些COM DLL并在我的项目中使用它们(Visual C++的#import指令,或使用Visual Basic .NET的对话框挑选和添加它们) - 这是供应商推荐的使用它们的方法.
我有兴趣找到一种在非Microsoft开发平台上使用这些DLL的方法.也就是说,在使用MinGW或Cygwin编译的C++项目中使用这些COM类,或者甚至将Wine的GCC端口编译为linux(将C++作为目标,将Win32编译为在Linux上本机运行的二进制文件).
我使用这个驱动程序取得了一些有限的成功,但是这在100%的情况下都没有成功(我不能使用某些方法返回的COM对象).
有人在类似情况下取得了成功吗?
我一直在Linux下玩Qt Creator 4.5.我的应用程序在Linux下构建得很好,但是如果我在Windows中构建,应用程序总是在启动时打开一个控制台窗口.
我可以阻止这样做吗?
我正在使用默认的MinGW设置构建,也许这是相关的.如果需要,我可以使用Visual Studio构建,但我想先了解发生了什么......
编辑:我刚刚在Windows下使用Qt Creator创建了一个简单的测试GUI应用程序,它没有表现出这种行为.由于在linux下创建项目的方式,或者我的应用程序执行了导致控制台窗口出现的内容,因此发生了此行为.我会在诊断时发布详细信息,以防其他人帮助.
我想用MinGW在Windows中构建OpenSSL,
我该怎么做?请帮我.
谢谢.
在阅读了DLL和EXE之间传递空对象的问题之后std::string,我担心用于构建我的gcc/libstdc ++的configure选项.更具体我想知道是否--enable-fully-dynamic-string在期间使用./configure.
我在Windows XP上使用MinGW 4.4.0.
有人知道用于构建此版本的配置吗?
是否有一般方法可以为任何GNU gcc安装找到此信息?gcc手册没有给我这个主题的暗示.
感谢您的输入!
我已经找到了关于这方面的文档,一无所获.我安装了MinGW,效果很好.我只是不知道如何使用调试器.
给出一些简单的代码,比如名为"mycode.cpp"的文件:
int main()
{
int temp = 0;
for (int i = 0; i < 5; ++i)
temp += i;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...我该怎么调试呢 我在Windows中使用MinGW和GDB调试代码的命令是什么?我可以像在Visual Studio中那样通过命令行单步执行代码吗?如果是这样,我用什么命令来做到这一点?
有没有关于在那里使用GDB的教程?我找不到任何东西,但是如果有人能指引我去做一件很棒的话.我厌倦了编写大量的std::cout语句来调试复杂的代码.
我正在使用Code :: Blocks和MinGW 4.4(我认为)编译器来创建一个C++项目.如果我从它的目录运行它,而不是从Code :: Blocks中运行,我会收到此系统错误.
The program can't start because libgcc_s_dw2-1.dll is missing from your computer. Try reinstalling the program to fix this problem.
Run Code Online (Sandbox Code Playgroud)
在这篇文章中, hardmath表示要添加-static-libgcc到编译器标志,静态链接到dll.当我尝试这个时,错误仍然发生.我可以通过将MinGW bin目录添加到我的计算机的Path变量来实现它,但我计划通过互联网分发我的程序.
该问题仅在更新到最新的G ++编译器后出现.除了我之外,这个解决方案为其他所有人工作的原因是什么?
编者注:类似于"程序错误点_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_无法在动态链接库中找到libstdc++-6.dll"的错误消息具有相同的原因,并且适用相同的解决方案.
如果我想在Windows中运行我的Irrlicht C++控制台应用程序,我会不断收到此错误:
the procedure entry point __gxx_personality_v0 could not be located in the dynamic link library libstdc++-6.dll
我正在使用CodeBlocks v12.11与MinGW和Irrlicht v1.8引擎.我正确设置了它.在我的电脑上还有一个安装了MinGW的Qt.是否可能存在冲突?
这是源代码:
#include <irrlicht.h>
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
int main() {
IrrlichtDevice *device = createDevice( video::EDT_OPENGL);
if (!device)
return 1;
IVideoDriver* driver = device->getVideoDriver();
ISceneManager* smgr = device->getSceneManager();
IGUIEnvironment* guienv = device->getGUIEnvironment();
guienv->addStaticText(L"Hello World", core::recti(10, 10, 100, 30));
device->setWindowCaption(L"Hello World! - …Run Code Online (Sandbox Code Playgroud) 我有一段C代码调用程序集中定义的函数.举个例子,假设foo.c包含:
int bar(int x); /* returns 2x */
int main(int argc, char *argv[]) { return bar(7); }
Run Code Online (Sandbox Code Playgroud)
并且bar.s包含x86程序集中bar()的实现:
.global bar
bar: movl 4(%esp), %eax
addl %eax, %eax
ret
Run Code Online (Sandbox Code Playgroud)
在Linux上,我可以轻松地使用GCC编译和链接这些源,如下所示:
% gcc -o test foo.c bar.s
% ./test; echo $?
14
Run Code Online (Sandbox Code Playgroud)
在使用MinGW的Windows上,此操作失败并显示"未定义引用"栏'的错误.事实证明,在Windows上,所有具有C调用约定的函数标识符都以下划线为前缀,但由于"bar"在汇编中定义,因此它不会获得此前缀并且链接失败.(所以错误信息实际上是抱怨错过了符号_bar,而不是吧.)
总结一下:
% gcc -c foo.c bar.s
% nm foo.o bar.o
foo.o:
00000000 b .bss
00000000 d .data
00000000 t .text
U ___main
U _bar
00000000 T _main
bar.o:
00000000 b .bss
00000000 d .data
00000000 t .text
00000000 T …Run Code Online (Sandbox Code Playgroud)