繁体   English   中英

在 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

我的类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

我在矩阵目录中放置了相当多的数据文件,只显示其中的几个。 在我的源文件中,我只是使用宏 MATRIXDIR:

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

这对我来说似乎很有效。 您可以使用其他版本的数据 automake 变量,例如 dist_data_DATA 而不是 pkgdata。 使用 pkgdata 这样您的数据不会与其他包混合是一个好主意。 nobase_ 是告诉 automake 在安装过程中不要剥离矩阵目录。 字符串类型似乎需要那些转义的双引号,以免出现编译器错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM