发出c++代码system()调用外部编译器编译其他c++代码

Posted

技术标签:

【中文标题】发出c++代码system()调用外部编译器编译其他c++代码【英文标题】:Issue c++ code system() to call external compiler to compile other c++ code 【发布时间】:2016-08-03 08:46:10 【问题描述】:

我正在使用 Qt 创建一个项目,该项目编译具有一个 .cpp 文件或多个 .cpp 和 .h 文件的外部 c++ 项目。

使用system("command") 我可以编译和运行一个 .cpp 文件,但我不知道如何编译多个文件:(

我尝试了不同的方法:

    system("cd the_files_directory") 然后 system("g++ *.h *.cpp -o execute") 但 system("dir") 告诉我它没有更改目录。

    system("g++ the_files_directory/*.h the_files_directory/*cpp -o execute)

    system("g++ -fworking-directory the_files_directory/*.h the_files_directory/*cpp -o execute")

在普通的 Windows 或 Linux 终端中都可以工作,但在系统(命令)中不起作用。

提前致谢

【问题讨论】:

你为什么要传递“*.h”?您是否打算尝试编译您的头文件? system("cd the_files_directory") 调用一个 shell 进程,该进程执行命令 cd the_files_directory 然后退出。你的 shell 和 CWD 没有改变。尝试使用chdir 呼叫。 system() 的每次调用都会打开它自己的shell,并在命令完成后退出它。所以像system("cd the_files_directory") 这样的做法是徒劳的。 在某些时候,使用 Makefiles 可能比尝试在单个编译器调用中拥有所有标志、文件和目录更容易。如果您需要动态变量,您仍然可以将变量传递给命令。 总的来说,这似乎是一个糟糕的主意。您为什么要尝试从另一个 C++ 程序中构建 C++ 源代码?这是什么乱七八糟的构建系统?! 【参考方案1】:
system("cd the_files_directory");
system("g++ *.h *.cpp -o execute");

第一行产生一个新进程,一个shell,它执行命令“cd the_files_directory”,然后退出。您的进程工作目录不受子进程的影响。所以当你执行g++命令时,你还在原来的目录中。

此外,此命令会尝试编译头文件 (.h),这可能会导致 g++ 失败,但可能只是多余的。

system("g++ the_files_directory/*.h the_files_directory/*cpp -o execute)

同样,您正在尝试编译头文件 (.h),这可能会导致 g++ 失败,但即使它有效,它也会在您的当前目录而不是 the_files_directory 中创建 execute。你可能想要

system("g++ the_files_directory/*.cpp -o the_files_directory/execute");

你的最后一个变种

system("g++ -fworking-directory the_files_directory/*.h the_files_directory/*cpp -o execute")

是同一个命令,带有目录的调试信息,所以和上面的问题是一样的。

给定('tfd' for 'the_files_directory'):

tfd/foo.cpp

#include <iostream>
#include "foo.h"

void foo() 
    std::cout << "foo\n";

tfd/foo.h

extern void foo();

tfd/test.cpp

#include "foo.h"

int main() 
    foo();

在顶层,comp.cpp

#include <stdlib.h>

int main() 
    system("g++ tfd/*.cpp -o tfd/execute");

我做了以下事情:

osmith@vbx:~/tmp$ g++ -Wall -std=c++14 comp.cpp -o compiler

执行编译器:

osmith@vbx:~/tmp$ ls tfd
foo.cpp  foo.h  test.cpp
osmith@vbx:~/tmp$ ./compiler
osmith@vbx:~/tmp$ ls tfd
execute  foo.cpp  foo.h  test.cpp

现在测试生成的可执行文件:

osmith@vbx:~/tmp$ tfd/execute
foo

【讨论】:

【参考方案2】:

-伙计们!昨晚我找到了自己的解决方案! - 这是我的步骤,在你们发帖之前,我自己对不同的方式进行了如此多的实验,肯定会奏效!

-步骤1: - 将我的整个项目从 Qt 项目位置移出并删除 .pro 和 Qt 生成的其他文件,只保留我自己的 .cpp 文件和 .h 文件。我怀疑 Qt 是否过于保护,因为我试图通过使用将我的项目移动到 Qt 项目构建文件夹的“当前位置” -system("复制项目路径/xxx.cpp xxx.cpp"); 这没有给出错误,但说 -(0) 文件被复制。 - 所以我决定摆脱Qt lol

-步骤2: -cd 我在 Windows 命令提示符中放置项目的文件夹

$cd project_path

-步骤3: - 在 Windows 命令提示符中编译我自己的项目

project_path$g++ *.h *.cpp -o execute

编译命令:g++ project_path\main.cpp project_path\pair.cpp project_path\map.cpp project_path\pair.h project_path\map.h

(我试图不在自己的目录中编译,但不知何故不起作用:(() ps:在我的项目中,我有这些代码来编译和运行外部程序:

    void compile()
    string s = "g++ "
               "project_path\\main.cpp "
               "project_path\\pair.cpp  "
               "project_path\\map.cpp  "                 
               "project_path\\pair.h  "
               "project_path\\map.h";//only this works!!!!

        char *compile_command = new char[s.length()];
        compile_command[0] = '\0';
        strcat(compile_command, s.c_str());
        cout << "compile command: " << compile_command << endl;
        system(compile_command);
    

-我尝试在字符串 s 的末尾添加“-o 执行”,但以后无法正常工作。我试图设置 s = "g++ project_path/*.h project_path/*cpp" 但它也没有工作:((

    void run(bool input, string input_path)
        if(input)
            string s = "a <" + input_path + "> print.txt";
            char *execute_command = new char[s.length() + 1];
            execute_command[0] = '\0';
            strcat(execute_command, s.c_str());
            system(execute_command);
            cout << "execute_command: " << execute_command << endl;
        else
            system("a > print.txt");
        
    

    int main()
        compile();
        run(false, "");
    

-Step4: -运行执行.exe

project_path$execute

然后会在 project_folder 中看到 a.exe 和 print.txt,并且 print.txt 显示正确的内容。

-我也尝试为一些需要使用 input.txt 输入的项目编译和运行。也很好用!!!

-稍后我也会尝试上面发布的解决方案!所有的解释都很好!非常感谢大家!美好的一天:D

【讨论】:

以上是关于发出c++代码system()调用外部编译器编译其他c++代码的主要内容,如果未能解决你的问题,请参考以下文章

是否允许 C++ 编译器发出编译同一程序的不同机器代码?

通过 C++ 运行外部 .exe

如果没有可用的 c++ 编译器,C 语言可以调用用 c++ 编写的 DLL 吗?

在设置 matlab 以访问外部 c++ 编译器时需要帮助

C++ DLL中的导出类在编译时会发出警告[重复]

如何使用 system() 函数 (MSVC) 编译 c++ 代码?