2014-02-10 57 views
1

我製作了一個C程序,它使用libsndfile從音頻文件中提取一些數據。編譯使用庫的C程序

有什麼可能使程序儘可能便攜,最好在安裝時不需要root權限?

Libsndfile在目標機器上不可用,所以我需要以某種方式將它與我的程序打包在一起。有沒有辦法靜態鏈接庫?我也看過一些Autotools教程,但我不知道如何繼續。

我可以沒有我的dev的機器,我在那裏安裝使用軟件包管理器庫上順利編譯:apt-get install libsnfile1-dev

生成文件很簡單:

CFLAGS=-std=c99 -Wall -pedantic -g 
CLIBS= -lsndfile -lm 
BIN=audiodecode 
CC=gcc 

MAIN=main.o 

FILES= 

OBJS=$(FILES) $(MAIN) 

.PHONY: all 
all: clean $(OBJS) 
    $(CC) $(CFLAGS) -o $(BIN) $(OBJS) $(CLIBS) 

.PHONY: clean 
clean: 
    rm -f *.o $(BIN) 
+0

你沒有說 - 我猜你在Linux上? 在任何情況下,我認爲正確的答案在下相關的是你在找什麼...例如http://stackoverflow.com/questions/16027854/gcc-static-library-linking-vs-dynamic-linking或https://stackoverflow.com/questions/3181154/linking-gsl-or-other-library-statically-into-a-shared-library – keshlam

+0

簡而言之,如果你不想分發共享庫,那麼任何函數調用你使用共享庫,將不得不在本地創建和定義(即在你的可執行文件中)。 – ryyker

回答

0

很多包捆綁他們的依賴。示例:rsync(包含捆綁的libpopt),gnupg(包含捆綁的libz)。通常捆綁的其他依賴項是gettext或glib。 請看這些流行的開源項目是如何實現的。

http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.25.tar.gz的內容放入子目錄並添加適當的規則以首先構建子目錄。

未測試樣本的代碼: OBJS + = libsndfile/libsndfile.a

libsndfile/libsndfile.a: 
     cd libsdndfile && ./configure --enable-static && $(MAKE) 

獎勵積分添加配置腳本,如果系統已經安裝libsndfile並鏈接到它動態地該檢查。