从system()调用G ++会返回错误

时间:2018-07-08 01:17:59

标签: c++ compiler-errors g++ mingw

我正在用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)
}

1 个答案:

答案 0 :(得分:0)

我无法完全复制您的方案,但是我认为库路径可能存在一些问题,正如Michael Doubez在评论中提到的那样。由于这种情况看起来是特定于环境的,因此我认为将没有封闭的表格/一般解决方案。如果链接器出现预期的问题,则以下顺序应该可以正常工作-

  1. 由于该程序在命令行上可以正常编译,因此您应该尝试运行

     g++ file.cpp -Wl,--verbose -o file  
    

    查看默认情况下为链接器设置了哪些标志。具体来说,命令输出的SEARCH_DIR字段(其中会有多个字段)将具有目录列表,链接程序将在这些目录中搜索库Reference

  2. 从上一步中记下这些目录路径,然后使用“ -L”标志示例-

    将这些路径传递到compileCommand变量中
    std::string compileCommand{ "g++ file.cpp -o file -L <path1> -L <path2> -L <path3>" };
    

    其中<path1><path2><path3> ...替换为您在步骤1中找到的路径。在这里,我们专门传递了链接器应在其中查找库的文件夹路径。

  3. 如果上述步骤不能解决问题,则必须手动为compileCommand指定库名称。要知道库名称,请运行以下命令-

    g++ file.cpp -o file  -Wl,--trace
    

    库的名称将以“ -l”示例--lstdc ++,-lgcc_s等开头。记下这些名称,除了在步骤2中传递的标志外,还将它们作为标志传递。 }变量应如下所示-

    compileCommand

    如果我们假设这是一个链接器问题,那么此序列通常应该可以解决您的问题。