以跨平台的方式在c++中调用外部文件(例如可执行文件)
Calling external files (e.g. executables) in C++ in a cross-platform way
我知道很多人以前都问过这个问题,但据我所知,没有一个明确的答案可以帮助c++初学者。所以,这是我的问题(或请求,如果你喜欢),
假设我正在使用Xcode或任何文本编辑器编写c++代码,并且我想使用其他c++程序中提供的一些工具。例如,一个可执行文件。那么,我如何在代码中调用可执行文件呢?
另外,我可以利用c++程序中提供的其他函数/对象/类,并通过这种调用技术在我的c++代码中使用它们吗?还是我只能调用可执行文件?
我希望有人能提供一个清晰的答案,初学者可以吸收…: p
那么,我如何在我的代码中调用可执行文件呢?
最简单的方法是使用system()
。例如,如果可执行文件名为tool,则:
system( "tool" );
然而,使用这种技术有很多注意事项。这个调用只是要求操作系统做一些事情,但是每个操作系统可以以不同的方式理解或回答同一个命令。
例如:system( "pause" );
…将在Windows中工作,停止执行,但在其他操作系统中不起作用。此外,关于文件路径内的空格的规则也不同。最后,甚至分隔栏也可以是不同的(""仅适用于windows)。
我也可以利用其他函数/对象/类…来自c++并通过这种调用技术在我的c++代码中使用它们?
没有。如果您想使用别人创建的类或函数,您必须获得它们的源代码,并将它们与您的程序一起编译。如果源代码足够小,这可能是最简单的方法之一。
很多时候,人们创建库,它是有用的类和/或函数的集合。如果库以二进制形式分发,那么您将需要dll文件(或其他操作系统的等效文件)和描述库提供的类和函数的头文件。对于c++程序员来说,这是一个非常令人沮丧的来源,因为即使是在同一操作系统中使用不同编译器创建的库也可能不兼容。这就是为什么很多时候库以源代码的形式分发,附带一列指令(makefile甚至更糟),以便在单个文件中获得二进制版本,以及一个头文件,如前所述。这是因为c++标准不包含编译器内部的底层内容。有很多实现细节可以自由地留给编译器供应商,让他们按照自己的意愿去做,可能是为了获得更好的性能。不幸的是,这意味着很难发布一个简单的库。
您可以很容易地调用另一个程序-这将启动一个完全独立的程序副本。参见system()或exec()调用族
这在unix中很常见,在unix中有许多小程序,它们接受文本输入流,做一些事情并将输出写入下一个程序。使用这些工具,您可以对一组数据进行排序或搜索,而无需编写任何代码。
在windows上,很容易自动启动文件的默认应用程序,所以你可以写一个pdf文件,然后启动默认应用程序来查看pdf。在Windows上更难的是控制一个单独的giu程序-除非该程序故意编写为允许远程控制(例如在Windows上使用com/ole),否则你无法控制用户在该程序中所做的任何事情。
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 如何在 linux 可执行文件中使用静态库
- 错误:当我从"WinDbg"打开可执行文件时,找不到符号文件。默认导出 ntdll 的符号.dll
- 编译的C可执行文件被Windows defender检测为病毒
- Linux 可执行文件通过 dlopen 在emplace_back崩溃打开共享库
- 是否可以在命令行中将输入参数传递给可执行文件
- 如何在可执行文件中存储常量数组?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- c ++:如何为每个特征制作特定的二进制文件(可执行文件)?
- 在英特尔C++编译器 (Linux) 的配置搜索路径中找不到文件可执行文件
- 在运行时动态更新二进制文件(可执行文件)而不停止的任何类型的方法