2012-07-02 96 views
3

我正在嘗試將一些圖像加載到非常基本的基於C++/SDL的程序中。圖像使用SDL_LoadBMP加載。我有圖像加載,一切似乎完美。我的問題是,圖像相對於我從哪裏調用程序加載。相對於二進制加載圖像

所以我有一個像這樣的目錄結構。

project/ 
    src/ 
     source.cpp 
    assets/ 
     image.bmp 
    bin/ 
     program 

當我從項目目錄(./bin/program)執行程序它使用的assets/image.bmp的路徑來加載圖像。有沒有什麼辦法可以使用../assets/image.bmp的相對路徑,這樣程序可以在任何地方執行?

我想我需要的東西,提供程序的絕對路徑,然後我可以追加我的路徑。

回答

3

在Linux上,/proc/self/exe是當前進程可執行文件的符號鏈接。所以你可以使用readlink找到它的路徑。從那裏你可以使用通常的路徑操作來找到你的資源。也許你應該迎合程序可執行文件再次成爲二進制文件所在位置的符號鏈接的情況,即只要當前路徑是符號鏈接就可以做更多的虛擬鏈接。

曾經有一個關於finding current executable's path without /proc/self/exe的問題,它也詢問了一個便攜式界面,但在接受的答案中沒有提供滿足所有需求的單一解決方案。

+0

哇,我不認爲這會很困難。那麼一個簡單的相對路徑,比如'../path'或'./path'就不行了?我想我將不得不建立或找到一個很好的功能,可以在大多數地方使用。我的目標是Linux,但我希望可以選擇稍後交叉編譯。 – Olical

+0

那麼'basename'呢?任何理由爲什麼不應該使用? http://stackoverflow.com/a/1019557/455137 – Olical

+0

相對路徑總是相對於當前工作目錄,這可能與您的二進制文件所在的目錄完全無關。如果您主要針對Linux,請閱讀[Unix編程常見問題的第1.14節](http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC23)。它建議不要使用二進制相對路徑。 – MvG

2

在Windows中:

  1. GetModuleFileName(NULL, ...讓你完整路徑二進制
  2. PathRemoveFileSpec(...讓你的目錄只
  3. PathCombine(..., _T("..\\..\\image.bmp"))與上述第二項可以讓你將圖像完全合格的路徑的結果