[英]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.