在编写可移植的c/c++程序时,使用外部文件的最佳方式是什么

When writing a portable c/c++ program, what is the best way to consume external files?

本文关键字:外部 文件 方式 最佳 是什么 程序 可移植 c++      更新时间:2023-10-16

我对c/c++场景还很陌生,在虚拟机上我已经被灌输了太久了。

我正在修改我们在整个公司使用的现有C++工具。该工具正在所有主要的操作系统(Windows、Mac、Ubuntu、Solaris等)上使用。我正在尝试将该工具与另一个Java编写的工具连接起来。基本上,我只需要从C++工具调用java-jar。

问题是,我如何知道罐子在用户计算机上的位置?c++可执行文件当前被签入Perforce,用户同步并调用exe,可能会将exe留在原地(尽管他们可以将其复制到其他地方)。我当前的解决方案检查exe旁边的jar文件。

我已经研究了从C++计算exe位置的多种方法,但似乎没有一种是可移植的。在windows上有一个"GetModuleLocation",在posix上,您可以查看procs/process.exe信息来确定进程的位置。在大多数系统上,你可以查看argv[0]来找出exe的位置。但由于用户使用$PATH、符号链接等来调用exe,大多数这些技术都是100%有保证的。

那么,有什么关于正确方法的指导意见吗?我想我可以定义多个解决方案,但似乎应该有一种更优雅的方法来做到这一点。

我不认为有一种可移植的方法可以做到这一点。C++标准本身并没有定义任何关于执行环境的内容。最好的方法是std::system调用,对于路径名中的Unicode字符等情况,它可能会失败。

这里的问题是,C和C++都在没有操作系统的系统上使用。没有$PATH这样的东西。因此,标准委员会要求一致性实施提供此类功能是毫无意义的。

我只想为POSIX写一个实现,为Mac写一个(如果它与POSIX有很大不同……从未使用过,所以我不确定),为Windows写一个。每个函数可能有3个函数调用;没有太多代码,并且您将确保遵循目标平台的约定。

我想为您指出一些URL,这些URL可能会帮助您找到当前可执行文件的位置。它看起来并不是所有方法都有一个(除了ARGV[0]+路径搜索方法,正如你所注意到的,它是可欺骗的,但是……你真的处于这样一个可能发生这种情况的威胁环境中吗?)。

如何在WindowsC++/CLI中获取应用程序可执行文件的名称?

https://superuser.com/questions/49104/handy-tool-to-find-executable-program-location

正在查找当前可执行文件';不带/proc/self/exe 的s路径

如何在C中找到可执行文件的位置?

有几种解决方案,没有一种是完美的。在Windows下,作为你说过,你可以使用GetModuleLocation,但这不可用在Unix下。您可以尝试模拟shell的工作方式,使用argv[0]getenv("PATH"),但这并不容易,也不是100%也可靠。(在Unix下,我认为在Windows下产卵应用程序可能会欺骗你,并将任何垃圾放入argv[0].)Unix下的常见解决方案是需要一个环境变量,例如MYAPPLICATION_HOME,它应该包含根安装应用程序的目录;应用程序不会在没有它的情况下启动。或者您可以要求用户使用命令行选项。

在实践中,我通常使用这三个选项:命令行选项优先级,并且在测试时非常有用;环境变量在Unix世界中运行良好,因为这是人们习惯的;如果两人都不在场,我会试着从我当时的位置算出来启动,在Windows下使用系统相关代码:GetModuleLocation,和CCD_ 9以及Unix下的所有其它。(Unix解决方案如果您已经有了将字符串分解为字段,并且正在使用boost::filesystem。)

好的解决方案是编写自定义函数,保证在您使用的每个平台上都能工作。最好应该使用运行时检查,如果它有效,然后只有在某些检测方法在所有平台中都不可用的情况下才回退到ifdefs。但是,检测正确执行的代码(例如argv[0])是否返回正确的路径可能并不容易。。。