我正在用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)
}
答案 0 :(得分:0)
我无法完全复制您的方案,但是我认为库路径可能存在一些问题,正如Michael Doubez在评论中提到的那样。由于这种情况看起来是特定于环境的,因此我认为将没有封闭的表格/一般解决方案。如果链接器出现预期的问题,则以下顺序应该可以正常工作-
由于该程序在命令行上可以正常编译,因此您应该尝试运行
g++ file.cpp -Wl,--verbose -o file
查看默认情况下为链接器设置了哪些标志。具体来说,命令输出的SEARCH_DIR
字段(其中会有多个字段)将具有目录列表,链接程序将在这些目录中搜索库Reference。
从上一步中记下这些目录路径,然后使用“ -L”标志示例-
将这些路径传递到compileCommand
变量中
std::string compileCommand{ "g++ file.cpp -o file -L <path1> -L <path2> -L <path3>" };
其中<path1>
,<path2>
,<path3>
...替换为您在步骤1中找到的路径。在这里,我们专门传递了链接器应在其中查找库的文件夹路径。
如果上述步骤不能解决问题,则必须手动为compileCommand
指定库名称。要知道库名称,请运行以下命令-
g++ file.cpp -o file -Wl,--trace
库的名称将以“ -l”示例--lstdc ++,-lgcc_s等开头。记下这些名称,除了在步骤2中传递的标志外,还将它们作为标志传递。 }变量应如下所示-
compileCommand
如果我们假设这是一个链接器问题,那么此序列通常应该可以解决您的问题。