我正在用C++写一个简单的编译器,该编译器接受Brainfuck代码并将其转换为C++。然后应该使用以下代码使用G++进行编译:
std::string compileCommand{ "g++ file.cpp -o file" };
system(compileCommand.c_str());
但是当我运行程序时,G++会产生此错误:
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
但是,当我运行...
g++ file.cpp -o file
...从程序外部进行编译就可以了。为什么会发生这种情况,我该如何解决?
file.cpp:
#include <iostream>
#include <stdio.h>
int main(int argc, char *argv[])
{
char *ptr = new char[30000]{ 0 };
++*ptr;
++*ptr;
putchar(*ptr)
}
最佳答案
我无法完全复制您的方案,但是我认为Michael Doubez在评论中提到的库路径可能存在一些问题。由于这种情况看起来是特定于环境的,因此我认为将没有封闭的表格/一般解决方案。如果预期链接器有问题,则以下顺序应该可以正常工作-
g++ file.cpp -Wl,--verbose -o file
查看默认情况下设置给链接器的标志。具体来说,命令输出的
SEARCH_DIR
字段(其中会有多个字段)将具有目录列表,链接器将在其中搜索Reference库。 compileCommand
变量-std::string compileCommand{ "g++ file.cpp -o file -L <path1> -L <path2> -L <path3>" };
其中
<path1>
,<path2>
,<path3>
...替换为您在step1中找到的路径。在这里,我们专门传递了链接器应在其中查找库的文件夹路径。 compileCommand
指定库名称。要知道库名称,请运行以下命令-g++ file.cpp -o file -Wl,--trace
库的名称以“-l”示例--lstdc++,-lgcc_s等开头。记下这些名称,除了在步骤2中传递的标志外,还将它们作为标志传递。
compileCommand
变量应如下所示-std::string compileCommand{ "g++ file.cpp -o file -L <path1> -L <path2> -L <path3> -lstdc++ -lgcc_s" };
如果我们假设这是一个链接器问题,那么此序列通常应该可以解决您的问题。