如何解决gcc linux中的多个定义错误?

时间:2011-05-21 09:46:07

标签: linux gcc multiple-definition-error

我在尝试静态链接libDuma时遇到以下错误,你能告诉我如何让g ++从libDuma中使用malloc吗?

sunny@sunny-laptop:~/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

2 个答案:

答案 0 :(得分: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 :(得分:1)

添加-nodefaultlibs标志以不链接到libc。或者,删除-lduma并在编译后使用以下命令动态链接:

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