2016-04-13 154 views
0

我想弄清楚安裝C和C++代碼的簡化方法 以及由它們構建的庫,主要用於Linux。我想認爲 GNU Autotools,CMake等對於我正在嘗試做的事情來說是過分的。從Linux上簡單安裝源代碼

一個例子:我寫了一些代碼,當'make'運行時,建立到 創建一個庫'example.a'。 (我將使用靜態鏈接到目前爲止 共享庫將引入更多的問題;在我走之前我會抓取它。)使用這些函數需要包括'example1.h','example2.h'等。

使用Autotools,可以運行'make install'或'sudo make install'至 將example.a複製到/ usr/local/lib,並將包含文件複製到/ usr/local/include。 如果構建了可執行文件,則會將其複製到/ usr/local/bin。

我嘗試添加以下行到我的生成文件:

安裝:
CP example.a在/ usr/local/lib目錄
CP example1.h在/ usr /本地/包括
CP例題.h/usr/local/include
cp示例/ usr/local/bin

這似乎很有效,主要是。其他項目則可以「看」 .h文件並正確構建。但.a文件未找到;唯一可以鏈接的 的方法是明確指定路徑爲 /usr/local/lib/example.a。 (儘管gcc堅持認爲它在那條路徑上尋找庫 )。所以:

問題1:我的用戶構建的庫應該放在/ usr/local/lib中嗎?還是我 我使用錯誤的目錄?

現在,我的下一個問題是:這必須用'sudo make install'來完成。 我在考慮對於這個類似的項目,其中只有一個用戶將 利用有問題的代碼,庫應該去 ,如$ HOME/lib,包括文件到$ HOME/include,可執行文件到 $ HOME/bin。

問題2:是否有一種「標準」方式爲當前用戶安裝 包括/庫,而不是爲所有用戶安裝? (從而避免 根使用的需要,我認爲這將是一個「乾淨」的系統,如果只使用 該程序的用戶不得不處理這些文件。)

回答

1

你應該使用install複製具有明確的權限。 example.a可能沒有找到,因爲它不以lib開頭(我知道一個愚蠢的要求)。

把你libincludebin$HOME/。當地可能是最接近每個用戶的標準設置。

編輯:

我只是測試它,它/usr/local/lib爲我工作得很好:

foo.c的

#include <stdio.h> 
void foo() { puts("foo"); } 

編譯並安裝:

gcc -c foo.c 
ar crs libfoo.a foo.o 
install -m 0755 /usr/local/lib #0644 should do too 

在不同的目錄:

的main.c

void foo(void); 
int main() { foo(); return 0; } 

編譯,鏈接,並運行:

gcc main.c -lfoo 
./a.out 
+0

謝謝。沒有聽說過「安裝」,但「安裝人員」讓我加快速度。重命名爲'libexample.a'沒有幫助;我會繼續調查。你對每個用戶設置的建議似乎是合理的,儘管我覺得奇怪的是沒有一個更「標準」的方法來做到這一點......當然,我不是第一個遇到這種情況? –

+0

/usr/local/lib適合我。我添加了一個例子。 – PSkocik

+1

啊,我看到我瘋狂的地方(和'man ld',看着-l選項證實了這一點):該文件必須命名爲'libfoo.a'。然後可以使用'-lfoo',ld將在前面加上lib,後面加上.a。 _或者你可以使用'-l:libfoo.a',它會直接處理它。再次感謝;這是相當莫名其妙的... –