我有一个C ++程序,旨在为我正在做的夏季项目运行模拟。它是计算密集型的,但我已获得使用集群计算机资源来运行它的权限,但我测试它并在我自己的笔记本电脑上开发它。该程序生成文本文件作为输出,这是我遇到麻烦的地方。
我需要将文本文件保存在不同的路径中,具体取决于我是在自己的计算机上还是在群集计算机上运行程序。我现在的解决方案是在我的makefile中使用$(shell hostname)
来检查编译代码的机器,并从该输出中使用条件编译以及从makefile中的该操作定义的宏。有一段时间,我使用了两个不同版本的标头,在我的计算机和集群上定义了不同的宏,但是我使用git存储库来回传输更改,我在排除一个文件时非常困难像这样。
我只是想知道在编译时在具有相同源的不同计算机上设置路径的最佳做法是什么。
答案 0 :(得分:3)
我觉得它不需要在不同的机器上进行不同的编译。听起来它需要从命令行或某种配置文件中在运行时获取一些路径。
一个建议是使用boost program options library,它在一个简单的设置中允许您从命令行或配置文件中读取相同的参数。这是我在大型集群或笔记本电脑上运行类似作业时使用的,它运行良好。
以下是他们的文档中的一个简单示例:
// Declare the supported options.
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("compression", po::value<int>(), "set compression level")
;
po::variables_map vm;
po::store(po::parse_command_line(ac, av, desc), vm);
po::notify(vm);
if (vm.count("help")) {
cout << desc << "\n";
return 1;
}
if (vm.count("compression")) {
cout << "Compression level was set to "
<< vm["compression"].as<int>() << ".\n";
} else {
cout << "Compression level was not set.\n";
}
答案 1 :(得分:1)
我同意Alex,最简单的解决方案不是在编译时,而是在运行时通过配置文件或命令行参数。在所有其他条件相同的情况下,您可以更轻松地尝试使用argv
和argc
通过命令行参数传递它。
答案 2 :(得分:1)
我对此并不十分熟悉,但我可以想到一个简单的方法。
设置一个环境变量,指向每台机器上的相应目录, 并在makefile中使用该环境变量。
例如,
在机器1的〜/ .bashrc
中export MY_DIRECTORY = ~/Foo
在机器2的〜/ .bashrc
中export MY_DIRECTORY = ~/Bar
你的Makefile将使用它运行的机器的环境变量。 例如。 $(MY_DIRECTORY) 并且(〜/ .bashrc不是您的存储库的一部分,因此两台机器上可以存在不同的副本)
答案 3 :(得分:0)
如果您可以依赖QtCore(750K到4MB库之间,具体取决于编译选项和平台),您可以使用QSettings方便地存储目录路径,而无需每次都设置目录路径。您可以在运行时一次的命令行上传递它,并让程序将结果存储到设置文件中,然后该设置将成为程序的未来调用的新默认值,而无需命令行参数
其他无依赖性的替代方案将涉及编写您自己的配置文件解析例程或使用现有的配置文件,但我总是喜欢依赖经过充分测试和开源的代码。
祝你好运!答案 4 :(得分:0)
您可以继续使用单独标头的路线。将您的Git存储库包含在clusterHeader.h
和laptopHeader.h
中,并使用现有的Makefile脚本在每个系统上使用不同的标头进行构建。为了简化链接问题,可能会在构建时临时将脚本中的文件从clusterHeader.hpp
或laptopHeader.hpp
重命名或复制到普通旧header.h
,并在脚本末尾更改名称。
如果您希望在版本之间保持标题中的更改一致,请将此方法用作另一个头文件,并在操作系统独立标头中使用该标头{。}}。
即。
#include
或者,只要系统不是完全相同的操作系统(我假设它们不是因为一个是集群),你可能很容易让它与一些简单的{{1}一起使用}陈述。
最后,CMake或qmake始终是选项。