2011-05-21 52 views
7

我在嘗試靜態鏈接libDuma時遇到了以下錯誤,請問如何讓g ++使用libDuma中的malloc?如何解決gcc linux中的多重定義錯誤?

[email protected]:~/CodeTest$ g++ ./testDuma.cpp -g -o testDuma -static -lduma -pthread 
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/libc.a(malloc.o): In function `free': 
(.text+0x4b00): multiple definition of `free' 
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/libduma.a(duma.o):(.text+0x25f0): first defined here 
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/libc.a(malloc.o): In function `malloc': 
(.text+0x4bc0): multiple definition of `malloc' 
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/libduma.a(duma.o):(.text+0x2730): first defined here 
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/libc.a(malloc.o): In function `realloc': 
(.text+0x5950): multiple definition of `realloc' 
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/libduma.a(duma.o):(.text+0x23d0): first defined here 
collect2: ld returned 1 exit status 

回答

3

不要強迫一個完全靜態鏈接(不使用-static標誌) - 任何現代的UNIX系統上這樣做是一個非常糟糕的主意(TM值)。

而是僅靜態鏈接libduma。無論這些命令應該工作:

g++ ./testDuma.cpp -g -pthread -o testDuma /path/to/libduma.a 
g++ ./testDuma.cpp -g -pthread -o testDuma -Wl,-Bstatic -lduma -Wl,-Bdynamic 
1

-nodefaultlibs標記添加到未連接到libc的標記。或者,刪除-lduma與編譯後動態地進行鏈接:

LD_PRELOAD=/usr/lib/libduma.so ./testDuma 
+0

與它沒有編制,我需要靜態鏈接libDuma -nodegaultlibs,它是強制性的我,這裏是我得到的錯誤http://pastebin.com/ydrdqN0J – SunnyShah 2011-05-21 10:14:03

+0

@SunnyShah:我不確定它能否正常工作,但可以試試'-z muldefs'鏈接器標誌。像:'g ++ testDuma.cpp -static -g -o testDuma -lduma -lpthread -Xlinker -z -Xlinker muldefs' – 2011-05-21 10:41:50

+0

感謝您的回覆,有一點疑問,關於如何讓G ++使用杜馬的符號而不是libc的? – SunnyShah 2011-05-21 10:58:32

相關問題