在 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.dat
和 File1.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 目录。字符串类型似乎需要那些转义双引号,这样您就不会遇到编译器错误。
我的项目文件夹结构如下
-Project/
/src
-Main.cpp
-MyReader.cpp
/headers
-MyReader.h
/DataFiles
-File.dat
-File1.dat
我的 class Object.cpp
有几个方法可以从 File.dat
和 File1.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 目录。字符串类型似乎需要那些转义双引号,这样您就不会遇到编译器错误。