我正在用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库。
  • 从上面的步骤中记下这些目录路径,并使用“-L”标志示例将这些路径传递给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" };
    

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