簡體   English   中英

在GNU / Linux系統上,我應該從哪里加載應用程序數據?

[英]On GNU/Linux systems, Where should I load application data from?

在這個例子中,我使用c和autoconf,但問題適用於其他地方。

我有一個在運行時需要的glade xml文件,我必須告訴應用程序它在哪里。 我正在使用autoconf在我的代碼中定義一個指向“指定前綴目錄”/ app-name / glade的變量。 但是只有在安裝應用程序后才能開始工作。 如果我想在那之前運行程序怎么辦? 是否有標准方法來確定應檢查應用程序數據的路徑?

謝謝


謝謝你的回復。 為了澄清,我不需要知道應用程序數據的安裝位置(例如,通過在/ usr,usr / local等中搜索),configure腳本會這樣做。 問題是更確定應用程序是否已安裝。 我想我會首先檢查安裝位置,如果不是,則在“./src/foo.glade”中檢查。

我認為沒有任何標准的方法可以找到這樣的數據。

我個人這樣做的方式是我有一個路徑列表,如果我可以找到任何人的文件,我會找到該列表,並且該列表應該包含從autoconf和CURRENTDIRECTORY + POSSIBLE_PREFIX定義的DATADIR + APPNAME前綴可能是構建根目錄中的某個文件夾。

但無論如何,不​​要忘記使用autoconf的那些定義來處理你的數據文件,那些讓你的軟件更容易打包(比如deb / rpm)

一般來說,這不應該是如何處理的,但是Debian打包器通常會在/ usr / share,/ usr / lib等等的某處安裝應用程序數據。 他們還可以修補軟件,使其從適當的位置讀取。 您可以查看Debian策略以獲取更多信息。

不過,我可以說幾句話。 首先,我不希望在單個目錄中找到該文件; 我首先創建一個目錄列表,我在fopen()包裝器中迭代。 這是我認為應該完成文件讀取的順序:

  • 當前目錄(顯然)
  • ~/.program-name
  • $(datadir)/program-name

$(datadir)是一個可以在Makefile.am中使用的變量。 例:

AM_CPPFLAGS = $(ASSERT_FLAGS) $(DEBUG_FLAGS) $(SDLGFX_FLAGS) $(OPENGL_FLAGS) -DDESTDIRS=\"$(prefix):$(datadir)/:$(datadir)/program-name/\"

這當然取決於configure的輸出以及configure.ac外觀。

因此,只需創建一個包裝器,它將迭代這些位置並從這些dirs獲取數據。 類似於PATH變量的東西,除了你實現迭代。

寫完這篇文章之后,我注意到我需要在這個項目中清理我們的實現,但它可以作為一個很好的開始。 看看我們的Makefile.am使用$(datadir)util.cpputil.h來獲得一個簡單的包裝器( yatc_fopen() )。 如果某些第三方庫正在執行fopen() ,我們也有yatc_find_file() ,例如SDL_image或libxml2。

如果程序是全局安裝的:

/usr/share/app-name/glade.xml

如果您希望程序在未安裝的情況下工作(即只提取tarball),請將其放在程序的目錄中。

我不認為有一種標准的文件放置方式。 我將它構建到程序中,我不會將其限制在一個位置。

這取決於需要多少定制配置文件。

我首先構建一個默認目錄列表並完成它們,直到我找到一個glade.xml實例並停止查找,或者找不到它並退出並顯示錯誤。 默認列表的優秀候選者是/ etc,/ usr / share / app-name,/ usr / local / etc.

如果文件是可自定義的,那么在查看默認目錄之前,我有一個用戶文件和路徑列表並通過它們進行處理。 如果找不到其中一個用戶版本,那么我查看默認目錄列表。 用戶配置文件的良好候選者是〜/ .glade.xml或〜/ .app-name / glade.xml或〜/ .app-name / .glade.xml。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM