Вызов G ++ из system () возвращает ошибку

Dan спросил: 13 июня 2018 в 11:37 в: c++

Я пишу простой транспилятор в 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 ответ

Sree Gowtham Josyula ответил: 16 июня 2018 в 07:21

Я не могу точно воспроизвести ваш сценарий, но я думаю, что может возникнуть проблема с библиотечными путями, о которых упоминал Майкл Дубез в комментариях. Поскольку этот случай выглядит специфичным для среды, я думаю, что не будет закрытого типа / общего решения как такового. Если есть проблема с компоновщиком, как ожидалось, следующая последовательность должна работать нормально -

  1. Поскольку программа компилирует для вас в командной строке, вы должны попробовать запустить

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

    , чтобы увидеть, какие флаги установлены для компоновщика по умолчанию. В частности, поля SEARCH_DIR (будет содержать несколько полей) вывода команды будут иметь список каталогов, в которых компоновщик будет искать библиотеки Reference .

  2. Запишите эти пути к каталогам с предыдущего шага и передайте эти пути к переменной compileCommand с примером флага "-L" -

    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 должна выглядеть так:

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

    Эта последовательность должна обычно решать ваша проблема, если наше предположение о том, что это проблема компоновщика, верна.

Дополнительное видео по вопросу: Вызов G ++ из system () возвращает ошибку

How To install MinGW on Windows 10 (GCC & G++)

How to Compile and Run C program Using GCC on Ubuntu 18.04 LTS (Linux)

How to install and run GCC compiler in Windows