Как решить множественные ошибки определения в gcc linux? - PullRequest
7 голосов
/ 21 мая 2011

Я сталкиваюсь с ошибками ниже при попытке статически связать libDuma. Можете ли вы сказать мне, как попросить g ++ использовать malloc из libDuma?

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 ]

3 голосов
/ 22 мая 2011

Не устанавливайте полностью статическую ссылку (не используйте флаг -static) - делать это на любой современной системе UNIX - крайне плохая идея (TM).

Вместо этого просто ссылатьсялибдума статически.Любая из этих команд должна работать:

g++ ./testDuma.cpp -g -pthread -o testDuma /path/to/libduma.a
g++ ./testDuma.cpp -g -pthread -o testDuma -Wl,-Bstatic -lduma -Wl,-Bdynamic
1 голос
/ 21 мая 2011

Добавить -nodefaultlibs флаг, чтобы не ссылаться на libc.Или удалите -lduma и динамически связывайте его после компиляции с помощью:

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