2015-12-02 37 views
0

原始

我正在尋找一種爲C庫創建非隔離開發環境的方法。用於C庫開發的虛擬環境

我將最有可能使用cmake建庫,我的IDE是一個簡單的文本編輯器。

現在的問題是,我不只是創建庫但也有一些樣本「應用程序」使用的庫。 因此我需要在某處安裝庫的頭文件和共享對象(我使用的是GNU/Linux),我不想將它安裝到/usr/local/lib或(更糟糕的)/usr/lib

有沒有一種方法創建一個類似於Python的pyvenv(以及類似),在那裏我可以將一切安裝到,但仍可以訪問主機庫的虛擬環境?

此外,我要重寫我的$PATH/$LD_LIBRARY_PATH,建立一個虛擬機,容器,或chroot環境。

的使用會再看看這樣的:

# switch to environment somehow 
loadenv library1 

# for library 
cd library 
make && make install 

# for application 
cd ../application1 
make && ./application1 

這可能嗎?

編輯1

所以基本上我的目錄結構如下所示:

library/ 
library/src/ 
library/src/<files>.c 
library/include/<files>.h 
application/ 
application/src/ 
application/src/<files>.c 

首先,我需要編譯庫,並安裝二進制文件和頭文件。 這些應該安裝在假的系統位置。

然後我可以編譯應用程序並運行它。

編輯2

我想到一點關於它,它似乎所有我需要的是一個文件系統,沙箱。 所以基本上我想打開一個shell,其中每次寫入磁盤都不會提交給文件系統,而是暫時保存在文件系統中。一個ramfs/tmpfs只在shell退出時被刪除。

這樣我可以準確測試是否編譯,部署並沒有任何危險現有的文件或目錄,而不會意外創建文件或目錄,而清潔起來真機上執行的一切都將如何表現。

回答

1

你並不需要'安裝'庫,你可以在開發樹中工作。 (1)編譯所有你需要做的就是使用-I標誌來指定庫頭文件的位置,這可以是一個相對路徑,例如在你的情況下你可以做-I ../。 ./library/include

(2)用於連接你需要告訴圖書館在位於連接器,你可以使用-L標誌追加到庫搜索順序。

(3)用於測試應用程序,你是正確的,因爲應用程序需要能夠找到圖書館。你有兩個選擇:

(一)確保庫和可執行文件是在同一目錄

(b)您可以臨時修改LD_LIBRARY_PATH,只在當前的shell,來進行測試:

 export LD_LIBRARY_PATH=abs_path_to_library:$LD_LIBRARY_PATH 

注意,這隻會影響你工作當前shell(命令終端)。任何其他殼可能已打開,或打開以後將有你的正常LD_LIBRARY_PATH。我知道你指定你不想修改你的PATH或LD_LIBRARY_PATH,但是作爲命令執行的shell的本地,這是一個很好的,簡單的方法。

(c)在客戶端可執行文件中嵌入庫的路徑。爲此,您需要將選項傳遞給鏈接器。海灣合作委員會的命令是:

 -Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH) 

看到this how-to

+0

謝謝你的回答,但是這不正是我想要的,我希望能夠編譯,部署和運行應用程序,如果庫被安裝在系統根目錄下,所以我可以確定一切正常,但同時不會垃圾我的根文件系統。 – benaryorg

+0

@benaryorg,在這種情況下,您需要一個VM或至少一個chroot環境。這個要求從你原來的問題中是不清楚的,或者我的閱讀理解能力隨着我清醒的時間減少而增加。 – thurizas

+0

那麼,在我的情況下,這並不是什麼大問題,但它引起了我的注意,因爲在那個方向似乎沒有任何問題。 [portage](https://wiki.gentoo.org/wiki/Portage)使用名爲'sandbox'的程序,該程序使用'$ LD_PRELOAD'以某種方式授予或阻止訪問特定目錄,但遺憾的是,它不支持臨時存儲數據。 – benaryorg