2014-09-28 63 views
2

我正在使用GTK爲運行Linux的C程序創建一個接口。如何在C中獲取應用程序路徑?

我使用這個函數來加載我的XML接口:

gtk_builder_add_from_file(builder, g_build_filename("myInterface.glade", NULL), &error); 

只要我在同一目錄作爲我編譯的文件,它的工作原理。 但是,如果我在另一個目錄中,讓我們說一個孩子,然後執行它:../a.out,我的程序找不到該文件。

所以我們的想法是首先獲取程序路徑(「/ home /.../program」)並添加文件名以獲取絕對路徑。

但我不知道如何獲得程序路徑。而且我不確定這是使其工作的最佳主意。

有什麼想法?謝謝!

+0

在哪個操作系統上需要它? – alk 2014-09-28 11:02:09

+1

到目前爲止,答案並沒有考慮到executbale開始時沒有給出路徑的情況,而是通過掃描PATH環境變量被shell發現。 – alk 2014-09-28 11:06:27

+2

相關如果操作系統是Linux:http://stackoverflow.com/q/606041/694576 – alk 2014-09-28 11:07:14

回答

0

argv [0]包含您運行程序時運行的相對/完整路徑。

剛剛掃描到最後的「/」,這將是從當前位置

「編輯」後,一些調查研究的運行目錄,我發現這一點,這在所有的情況下工作:

#include<stdio.h> 
#include <unistd.h> 
#include <string.h> 
#include <libgen.h> 
int main() 
{ 
    char path[500] = {0}; 
    int dest_len = 500; 
    if (readlink ("/proc/self/exe", path, dest_len) != -1) 
    { 
     dirname (path); 
     strcat (path, "/"); 
     printf("path=%s\n", path); 
    } 
} 
+4

'argv [0]'包含程序被調用的名稱。你不能依靠其中的完整路徑。 – MicroVirus 2014-09-28 10:49:03

+0

好的,我修改了我的回答 – 2014-09-28 10:59:30

+0

這仍然濫用參數向量,並且不可靠作爲問題的解決方案。 argv [0]只是被調用的程序名稱:它可能包含一個相對路徑,它可能包含一個完整路徑,它可能根本不包含任何路徑。 – jku 2014-09-29 09:21:59

1

在您使用GTK的情況下,最好使用GResource並將myInterface.glade直接編譯到您的程序中。

相關問題