在 linux 上安装后如何使 C++ 程序读取预定义文件

How can I make a C++ program to read predefined files after installation on linux

我的项目文件夹结构如下

-Project/
        /src
             -Main.cpp
             -MyReader.cpp
        /headers
             -MyReader.h
        /DataFiles
             -File.dat
             -File1.dat

我的 class Object.cpp 有几个方法可以从 File.datFile1.dat 读取并将信息解析为 Map 对象。我的问题是我正在使用 Autotools(我非常非常新手)来生成配置和安装程序文件,我不知道如何在安装后让程序访问所有 DataFiles 文件。该程序无法正常工作,因为代码在尝试通过相对路径读取这些文件时失败。在本地,程序在终端make && ./program中执行后完美运行。

我该如何解决这个问题?预先感谢您的帮助!

使用 Autotools 执行此操作的平台独立方法是使用 $(datadir) 变量定位系统数据目录并相对于该目录工作。

因此,在您的 Makefile.am 文件中,您可以创建这样的名称:

myprog_infodir = $(datadir)/myprog

# Set a macro for your code to use
myprog_CXXFLAGS = -DDATA_LOCATION=\"$(datadir)/myprog\"

# This will install it from the development directories
myprog_info_DATA = $(top_srcdir)/DataFiles/File.dat $(top_srcdir)/DataFiles/File1.dat

# make sure it gets in the installation package
extra_DIST = $(top_srcdir)/DataFiles/File.dat $(top_srcdir)/DataFiles/File1.dat

那么在你的程序中你应该可以这样引用数据:

std::ifstream ifs(DATA_LOCATION "/File.dat");

免责声明: 未经测试的代码

我想出了一个方法,我会在这里举个例子:

在我的Makefile.am

AM_CPPFLAGS = -D MATRIXDIR="\"$(pkgdatadir)/matrix\""

nobase_dist_pkgdata_DATA = matrix/AAcode.txt  \
matrix/BLOSUM50 matrix/BLOSUM70.50 matrix/BLOSUM100 matrix/BLOSUM50.50 \
matrix/BLOSUM75 matrix/BLOSUM100.50 matrix/BLOSUM55 matrix/BLOSUM75.50 \
... more not shown

我在matrix目录下放了很多数据文件,只展示其中的几个。在我的源文件中,我只使用宏 MATRIXDIR:

scorematrix.cpp:string MatrixScoreMethod::default_path=MATRIXDIR;

这似乎很适合我。您可以使用其他版本的 data automake 变量,例如 dist_data_DATA 而不是 pkgdata。最好使用 pkgdata,这样您的数据就不会与其他包混合。 nobase_ 是告诉 automake 在安装过程中不要剥离 matrix 目录。字符串类型似乎需要那些转义双引号,这样您就不会遇到编译器错误。