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

Calling G++ from system() returns an error

本文关键字:一个 返回 错误 G++ system 调用      更新时间:2023-10-16

我正在用C++编写一个简单的transiler,它接受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在评论中提到的那样。由于这个案例看起来是特定于环境的,我认为不会有这样的封闭形式/通用解决方案。如果链接器出现预期的问题,以下序列应该可以正常工作-

  1. 由于程序在命令行上编译良好,您应该尝试运行

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

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

  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"开头,例如-lsdc++、-lgcc_s等。记下这些名称,并将它们作为除步骤2中传递的标志之外的标志传递。你的compileCommand变量应该是这样的-

    std::string compileCommand{ "g++ file.cpp -o file -L <path1> -L <path2> -L <path3> -lstdc++ -lgcc_s" }; 
    

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