簡體   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