3

我有一个 C++ 程序,旨在为我正在做的暑期项目运行模拟。它的计算量很大,但我已获得使用集群计算机资源来运行它的许可,但我在自己的笔记本电脑上对其进行了测试和开发。该程序生成文本文件作为输出,这就是我遇到麻烦的地方。

我需要将文本文件保存在不同的路径中,具体取决于我是在自己的计算机上还是在集群计算机上运行程序。我现在的解决方案是$(shell hostname)在我的 makefile 中使用来检查代码正在哪台机器上编译,并从该输出中使用条件编译以及从 makefile 中的该操作定义的宏。有一次,我使用了两个不同版本的标头,它们在我的计算机和集群上定义了不同的宏,但是我使用 git 存储库来来回传输更改,并且我很难排除一个文件像这样。

我只是想知道在编译时在具有相同源的不同计算机上设置路径的最佳做法是什么。

4

5 回答 5

3

在我看来,它不需要在不同的机器上进行不同的编译。听起来它需要在运行时从命令行或某种配置文件中获取一些路径。

一个建议是使用boost 程序选项库,它在一个简单的设置中允许您从命令行或配置文件中读取相同的参数。这是我在大型集群或笔记本电脑上运行类似作业时使用的,它运行良好。

以下是他们文档中的一个简单示例:

// 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";
}
于 2012-07-11T13:57:06.727 回答
1

我同意 Alex 的观点,最简单的解决方案不是在编译时,而是在运行时通过配置文件或命令行参数。在所有其他条件相同的情况下,您可能更容易尝试通过命令行参数使用argvand传递它argc

于 2012-07-11T13:50:11.873 回答
1

我对此不是很有经验,但我可以想到一种简单的方法。

在每台机器上设置一个指向相应目录的环境变量,并在您的 makefile 中使用该环境变量。

例如,

在机器 1 的 ~/.bashrc

export MY_DIRECTORY = ~/Foo

在机器 2 的 ~/.bashrc

export MY_DIRECTORY = ~/Bar

您的 Makefile 将使用运行它的机器的环境变量。例如。$(MY_DIRECTORY) 和(~/.bashrc 不是你存储库的一部分,所以两台机器上可以存在不同的副本)

于 2012-07-11T14:09:24.043 回答
0

如果您可以忍受对 QtCore 的依赖(根据编译选项和平台,库在 750K 和 4MB 之间),您可以使用 QSettings 方便地存储目录路径,而无需每次都设置目录路径。您可以在运行时在命令行上将其传递一次,然后让程序将结果存储到设置文件中,然后该设置将成为将来调用程序时无需命令行参数的新默认值。

其他无依赖的替代方案包括编写自己的配置文件解析例程或使用现有的例程,但我总是喜欢依赖经过良好测试的开源代码。

祝你好运!

于 2012-07-11T13:57:10.497 回答
0

您可以继续使用单独的标头的路线。将两者都包含在您的 Git 存储库中clusterHeader.hlaptopHeader.h并使用您现有的 Makefile 脚本在每个系统上使用不同的头文件进行构建。为了缓解链接问题,可能会在构建时临时重命名或复制脚本中的文件,或将其复制为clusterHeader.hpp普通laptopHeader.hpp旧文件header.h,并在脚本末尾更改回名称。

如果您想在构建之间保持头文件的更改一致,请将此方法用作另一个头文件,并将#include该头文件放在与操作系统无关的头文件中。

IE

source.cpp
|
-> header.hpp
    |
    -> clusterHeader.hpp OR laptopHeader.hpp

或者,只要系统不是完全相同的操作系统(我假设它们不是,因为一个是集群),您可能很容易让它与一些简单的#ifdef语句一起工作。

最后,CMake 或 qmake 始终是选项。

于 2012-07-11T14:14:48.163 回答