发出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++代码的主要内容,如果未能解决你的问题,请参考以下文章