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

     2023-02-22     209

关键词:

【中文标题】发出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++ 编译器发出编译同一程序的不同机器代码?

】是否允许C++编译器发出编译同一程序的不同机器代码?【英文标题】:IsaC++compilerallowedtoemitdifferentmachinecodecompilingthesameprogram?【发布时间】:2011-03-0411:48:38【问题描述】:考虑一种情况。我们有一些特定的C++编译器、一组特定... 查看详情

C++ 从 Visual Studio 编译源文件

...员命令提示符中选择的:cl/EHsctest.cpp所以我尝试了这个:system("cl/EHsctest.cpp");但是system()调用的普通cmd中不存在命令\'cl\' 查看详情

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

】如何使用system()函数(MSVC)编译c++代码?【英文标题】:Howtocompilec++codewithsystem()function(MSVC)?【发布时间】:2020-03-2715:02:17【问题描述】:我正在尝试使用c++编译带有system()函数的c++文件。voidCodeGenerator::GenerateExe(ProgramNode*parsed_tree,... 查看详情

编译python代码并将其链接到C++程序?

】编译python代码并将其链接到C++程序?【英文标题】:CompilepythoncodeandlinkittoC++program?【发布时间】:2014-12-1514:24:57【问题描述】:我很清楚存在许多允许C代码运行python代码的可能性,反之亦然(Cython、Boost.Python、...)。但是,... 查看详情

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

】如果没有可用的c++编译器,C语言可以调用用c++编写的DLL吗?【英文标题】:CanClanguagecalltheDLLwritteninc++ifnotc++compileravailable?【发布时间】:2013-07-2921:52:52【问题描述】:我有一个DLL来控制一些用C++编写的外部设备。但是在开发... 查看详情

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

】在设置matlab以访问外部c++编译器时需要帮助【英文标题】:Needhelponsettingupmatlabtoaccessexternalc++compiler【发布时间】:2012-10-1211:28:01【问题描述】:我目前正在关注SIFTGPUmatlab教程,并且卡在这个非常早期的部分:SIFTGPU用C++编码,... 查看详情

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

...LL而不是使用.lib,但在声明导出功能后我需要导出VSExpress编译器给出了一个警告声明\'PipeTrans 查看详情

C++ 将外部 .exe 嵌入到我编译的 .exe 中

...的文件夹中的另一个.exe发送命令。我以这种格式发送:system("tools\\\\program.exe-r-wfile.datfile_new.dat" 查看详情

通过 C++ 运行外部 .exe

....exe文件(从fortran编译)我试过很多不同的版本,比如:system("C:/IPSE_temp/CEA_schwing.exe");编译没问题,但是当我执行文件时,他错过了一些库,例如RUND32.dll...然后我尝 查看详情

c++和c代码互相调用是不可避免的

C++编译器能够兼容C语言发编译方式C++编译器会优先使用C++编译的方式extern关键字能强制让C++编译器进行C方式的编译  external“C”  {    //doC-stylecompilationhere  }  查看详情

C++ Visual Studio 2010 C4717 编译器在代码的一部分中发出警告,但在另一部分中没有

】C++VisualStudio2010C4717编译器在代码的一部分中发出警告,但在另一部分中没有【英文标题】:C++VisualStudio2010C4717compilerwarninginonepartofcodebutnotinanother【发布时间】:2012-04-1022:42:37【问题描述】:这六种方法(实际上是三种,实际引... 查看详情

为啥此 C++ 代码仅在 Microsoft 编译器上具有模棱两可的方法调用?

】为啥此C++代码仅在Microsoft编译器上具有模棱两可的方法调用?【英文标题】:WhyhasthisC++codeanambiguousmethodcallonlyonMicrosoftcompiler?为什么此C++代码仅在Microsoft编译器上具有模棱两可的方法调用?【发布时间】:2017-12-1620:36:42【问题... 查看详情

用c++绘制一元三次方程曲线,跪求要完整代码

...lo.c编译之后,在输入:mexhello程序就开始运行了~2,是用c编译器调用MATLABc++数学函数库,这个就有点难了,至今我也不怎么会,你自己找本书可以学习一下,我现在看一本书:MATLABC++应用开发(甘才军编,清华大学出版社),这... 查看详情

调用复制 ctor 而不是移动 ctor - 编译器可以发出警告吗?

】调用复制ctor而不是移动ctor-编译器可以发出警告吗?【英文标题】:Copyctoriscalledinsteadofmovector-Cancompilergiveawarning?【发布时间】:2018-02-2012:27:56【问题描述】:在以下代码中,我想移动构造一个没有可用移动构造函数的对象:cl... 查看详情

初学者在 C++ 中调用函数,代码编译数学是错误的

】初学者在C++中调用函数,代码编译数学是错误的【英文标题】:beginnercallingfunctionsinc++,codecompilesmathiswrong【发布时间】:2021-04-1904:45:53【问题描述】:所以我是C++新手,我认为我了解如何在函数方面掌握基础知识,但我遇到了... 查看详情

如何在 Visual C++ 中跟踪到外部编译的库

...以很好地链接它们并且它们运行。但是当我尝试从我的cpp代码中进入一个openssl函数时,它只是跳过了。我 查看详情

DLL 注入编译“未解析的外部符号”Visual Studio C++

...C++【发布时间】:2017-10-2221:48:30【问题描述】:删除专有代码以防止复制想法【问题讨论】:【参考方案1】:您没有定义那些缺失的符号。您只在头文件中声明了它们。您仍然需要在.cpp文件中定义它们而不使 查看详情

C++ 编译器实际上是如何传递引用参数的?

】C++编译器实际上是如何传递引用参数的?【英文标题】:HowdoC++compilersactuallypassreferenceparameters?【发布时间】:2011-02-2513:55:13【问题描述】:这个问题是由一些混合语言编程引起的。我有一个想从C++代码调用的Fortran例程。Fortran... 查看详情