![](/img/trans.png)
[英]Where can I learn how to make a C++ program interact with the Operating System (Linux)
[英]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.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
我在矩阵目录中放置了相当多的数据文件,只显示其中的几个。 在我的源文件中,我只是使用宏 MATRIXDIR:
scorematrix.cpp:string MatrixScoreMethod::default_path=MATRIXDIR;
这对我来说似乎很有效。 您可以使用其他版本的数据 automake 变量,例如 dist_data_DATA 而不是 pkgdata。 使用 pkgdata 这样您的数据不会与其他包混合是一个好主意。 nobase_ 是告诉 automake 在安装过程中不要剥离矩阵目录。 字符串类型似乎需要那些转义的双引号,以免出现编译器错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.