gpt4 book ai didi

c++ - 替换我的 C++ 程序中对 "system"的调用

转载 作者:行者123 更新时间:2023-11-30 17:35:15 25 4
gpt4 key购买 nike

我正在尝试在我的 C++ 程序中找到调用“system”(来自 stdlib.h)的替代品。到目前为止,我一直在程序中使用它调用 g++ 进行编译,然后链接用户选择的目录中的可变数量的源文件。

这里我有一个示例,该命令大致如下所示:“C:/mingw32/bin/g++.exe -L"C:\mingw32\lib"[...]"

但是,我遇到的问题是(至少对于我正在使用的 MinGW 编译器),当命令执行时,我收到错误“命令行太长”字符串变得太长。就我而言,它大约有 12000 个字符长。所以我可能需要另一种方式来调用 g++。此外,我了解到您通常无论如何都不应该使用“系统”:http://www.cplusplus.com/forum/articles/11153/

所以我需要一些替代品(它也应该尽可能独立于平台,因为我希望程序在 Windows 和 Linux 上运行)。我发现了一位看起来非常适合的候选人:

  • _execv/execv:

    独立于平台,但是:

    a) http://linux.die.net/man/3/exec说“exec() 系列函数用新的进程镜像替换当前进程镜像”。那么我是否需要先调用“fork”,这样C++程序才不会终止? fork 也可以在 Windows/MSVC 上使用吗?

    b) 使用“system”,我测试了返回值是否为0,看看源文件是否可以编译。这将如何与 exec 一起工作?如果我正确理解了联机帮助页,它是否只会返回创建新进程的成功,而不返回 g++ 的状态?我可以使用哪个函数来暂停程序以等待 g++ 完成并获取返回值?

总而言之,我不太确定应该如何处理这个问题。您有什么建议? Java (Runtime.getRuntime().exec(command)) 或 Eclipse C++ IDE 等多平台程序如何在内部解决这个问题?您建议我如何以独立于系统的方式调用 g++ - 使用尽可能多的参数?

编辑:现在我正在使用以下代码 - 我只在 Windows 上测试过它,但至少它似乎按预期工作。谢谢你的想法,jxh!也许我将来会考虑使用相对路径来缩短命令。然后我必须找到一种独立于平台的方法来更改新进程的工作目录。

#ifdef WIN32
int success = spawnv(P_WAIT, sCompiler.c_str(), argv);
#else
pid_t pid;
switch (pid = fork()) {
case -1:
cerr << "Error using fork()" << endl;
return -1;
break;
case 0:
execv(sCompiler.c_str(), argv);
break;
default:
int status;
if (wait(&status) != pid) {
cerr << "Error using wait()" << endl;
return -1;
}
int success = WEXITSTATUS(status);
}
#endif

最佳答案

如果您的所有文件都位于(或可以移动到)一个(或一小部分)目录中,那么您可能会喜欢其中一些命令行选项。给定您的 audio.o 示例路径,这将使您的命令行减少约 90%。

-Ldir
Add directory dir to the list of directories to be searched for `-l'.

来自:https://gcc.gnu.org/onlinedocs/gcc-3.0/gcc_3.html#SEC17

-llibrary
Search the library named library when linking.

在命令中的哪个位置写入此选项会有所不同;链接器按照指定的顺序搜索进程库和目标文件。因此,foo.o -lz bar.o' 在文件 foo.o' 之后、bar.o' 之前搜索库z'。如果bar.o'引用z'中的函数,则可能不会加载这些函数。

链接器在标准目录列表中搜索库,该库实际上是一个名为“liblibrary.a”的文件。然后链接器使用该文件,就好像它是通过名称精确指定的一样。

搜索的目录包括几个标准系统目录以及您用“-L”指定的任何目录。

通常,通过这种方式找到的文件是库文件——其成员是目标文件的归档文件。链接器通过扫描归档文件来查找定义迄今为止已被引用但尚 undefined symbol 的成员来处理归档文件。但如果找到的文件是普通目标文件,则以通常的方式链接它。使用-l'选项和指定文件名之间的唯一区别是-l'用lib'和.a'包围库并搜索多个目录。 p>

来自:http://gcc.gnu.org/onlinedocs/gcc-3.0/gcc_3.html

关于c++ - 替换我的 C++ 程序中对 "system"的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23033337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com