在编写便携式c / c ++程序时,使用外部文件的最佳方法是什么?

时间:2011-06-28 16:28:10

标签: c++ c

我对c / c ++场景很陌生,我已经在虚拟机上用勺子喂了太长时间。

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

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

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

那么,任何关于正确方法的指导都将始终有效吗?我想如果找到多个解决方案我没有问题,但似乎应该有更优雅的方式来做到这一点。

4 个答案:

答案 0 :(得分:5)

我不相信有这样做的便携方式。 C ++标准本身没有定义任何有关执行环境的内容。您获得的最好的是std::system调用,并且路径名中的Unicode字符可能会失败。

这里的问题是C和C ++都用在没有操作系统之类的系统上。没有$PATH这样的东西。因此,标准委员会要求符合要求的实施提供此类功能将是荒谬的。

我只会为POSIX编写一个实现,一个用于Mac(如果它与POSIX显着不同...从未使用它,所以我不确定),一个用于Windows(在编译时选择哪一个)预处理器)。它可能是每个函数调用3个;不是很多代码,而且你会确定你遵循目标平台的惯例。

答案 1 :(得分:1)

我想指出一些可能帮助您找到当前可执行文件所在位置的URL。它似乎没有一种方法适用于所有人(除了ARGV [0] +路径搜索方法,你注意到它是可欺骗的,但是......你真的在威胁环境中,这可能会发生吗?)。

How to get the application executable name in WindowsC++/CLI?

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

Finding current executable's path without /proc/self/exe

How do I find the location of the executable in C?

答案 2 :(得分:1)

有几种解决方案,其中没有一种是完美的。在Windows下,作为 你说过,你可以使用GetModuleLocation,但那是不可用的 在Unix下。您可以尝试使用来模拟shell的工作方式 argv[0]getenv("PATH"),但这并不容易,而且不是100% 可靠的。 (在Unix下,我认为在Windows下也是如此 产卵应用程序可以欺骗你,并把任何类型的垃圾 argv[0]。)Unix下的常用解决方案是需要一个环境 变量,例如MYAPPLICATION_HOME,应该包含根 安装应用程序的目录;申请不会 没有它就开始。或者您可以要求用户指定根路径 命令行选项。

在实践中,我通常使用全部三种:命令行选项 优先级,在测试时非常有用;环境变量 在Unix世界中运行良好,因为它是人们习惯的;而如果 两者都不存在,我会试着找出我所在的位置 使用系统相关代码启动,在Windows下使用GetModuleLocation, 和getenv("PATH")以及Unix下的所有其他内容。 (Unix解决方案 如果您已经有用于打破字符串的代码,那就不那么难了 字段,正在使用boost::filesystem。)

答案 3 :(得分:0)

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