2012-05-16 68 views
0

我正在嘗試創建共享庫版本praatlib。代碼本身帶有一個生成靜態庫的Makefile,但爲了我的目的,我需要一個共享庫。我試過兩件事。我嘗試的第一件事就是編輯Makefile以生成共享庫和靜態文件。C/C++嘗試創建共享庫時出錯。製作庫的靜態版本時不會發生錯誤

下面是生成靜態庫生成文件的一部分:

libpraat.a: 
    cd GSL; make 
    cd num; make 
    cd num/glpk; make 
    cd kar; make 
    cd audio; make 
    cd mp3; make 
    cd FLAC; make 
    cd stat; make 
    cd fon; make 
    cd dwsys; make 
    cd dwtools; make 
    cd LPC; make 
    cd FFNet; make 
    cd artsynth; make 
    cd library; make 
    rm -f libpraat.a 
    ar r libpraat.a `find num glpk audio stat LPC FFNet dwtools artsynth fon stat dwsys GSL kar FLAC mp3 library -name "*.o"` 

這裏是我說什麼,產生的共享庫。

libpraat.so: 
    cd GSL; make 
    cd num; make 
    cd num/glpk; make 
    cd kar; make 
    cd audio; make 
    cd mp3; make 
    cd FLAC; make 
    cd stat; make 
    cd fon; make 
    cd dwsys; make 
    cd dwtools; make 
    cd LPC; make 
    cd FFNet; make 
    cd artsynth; make 
    cd library; make 
    rm -f libpraat.so 
    $(CC) -shared -Wl,-soname,libpraat.so -o libpraat.so `find num glpk audio stat LPC FFNet dwtools artsynth fon stat dwsys GSL kar FLAC mp3 library -name "*.o"` 

但是當它試圖使共享庫錯誤出來時,靜態庫被製作而沒有遇到任何問題。

這是錯誤信息的開始(有很多錯誤,但它們基本上與我在下面粘貼的錯誤信息相同)。

gcc -std=gnu99 -DUNIX -Dlinux -DCONSOLE_APPLICATION -I /usr/local/include -I /usr/X11R6/include -Wimplicit -Wreturn-type -Wunused -Wunused-parameter -Wuninitialized -O -fPIC -Wall -shared -Wl,-soname,libpraat.so -o libpraat.so `find num glpk audio stat LPC FFNet dwtools artsynth fon stat dwsys GSL kar FLAC mp3 library -name "*.o"` 
stat/Table.o: In function `Table_getStringValue': 
Table.c:(.text+0x246): multiple definition of `Table_getStringValue' 
stat/Table.o:Table.c:(.text+0x246): first defined here 
stat/Table.o:(.data.rel+0x174): multiple definition of `classTable' 
stat/Table.o:(.data.rel+0x174): first defined here 
stat/Table.o:(.data.rel+0xb4): multiple definition of `classTableRow' 
stat/Table.o:(.data.rel+0xb4): first defined here 
stat/Table.o: In function `Table_appendRow': 
Table.c:(.text+0x1147): multiple definition of `Table_appendRow' 
stat/Table.o:Table.c:(.text+0x1147): first defined here 
stat/Table.o: In function `Table_initWithoutColumnNames': 
Table.c:(.text+0x11a5): multiple definition of `Table_initWithoutColumnNames' 
stat/Table.o:Table.c:(.text+0x11a5): first defined here 
stat/Table.o: In function `Table_createWithoutColumnNames': 
Table.c:(.text+0x123f): multiple definition of `Table_createWithoutColumnNames' 
stat/Table.o:Table.c:(.text+0x123f): first defined here 
stat/Table.o: In function `Table_insertColumn': 
Table.c:(.text+0x1298): multiple definition of `Table_insertColumn' 
stat/Table.o:Table.c:(.text+0x1298): first defined here 
stat/Table.o: In function `Table_appendColumn': 
Table.c:(.text+0x151e): multiple definition of `Table_appendColumn' 

嘗試了很多不同的事情,感到沮喪我嘗試了轉換,我用這個命令直接過到一個共享庫的靜態庫後:

g++ -std=c++98 -fpic -g -O1 -shared -o libpraat.so -Wl,--whole-archive libpraat.a 

,但我有一個類似的錯誤信息像之前一樣。我對構建大型項目或圖書館的經驗不是很多,所以我失去了如何才能使其發揮作用。如果有人能解釋導致我遇到的錯誤的原因以及我如何解決它,我將不勝感激。

+0

如果你拿出所有「-Wl」位? – slugonamission

回答

3

讓我們來仔細看一下你用於查找目標文件的命令:

find num glpk audio stat LPC FFNet dwtools artsynth fon \ 
     stat dwsys GSL kar FLAC mp3 library -name "*.o" 

注意stat出現兩次。不要這樣做。

+0

謝謝你。不幸的是,原作者寫的和我認爲錯誤的原因是由於我介紹過的東西造成的,所以我從不太關注那個發現語句。 – martega

+0

我認爲在製作靜態庫時它不起作用,因爲每個靜態庫只能保存一個具有給定名稱的對象文件。 –

相關問題