Создание динамической библиотеки из статических с использованием gcc --shared -m64 -Wl, - whole-archive ./*.a - PullRequest
4 голосов
/ 03 января 2012

Я получаю этот набор ошибок gcc, и я не могу получить ответ от Google или man-страниц.Любое понимание того, что это значит или с чего начать искать?

Вот строка в make-файле:

#After building several otehr bits of code into static libraries
...
# Grand finally link all the object files into one
        gcc --shared  \
        -m64 \
        -Wl,--whole-archive ./release64/*.a \
        -o ./release64/libMYLIB.so.1.0
        ln -sf libArcGIS.so.1.0 ./release64/libMYLIB.so
        ln -sf libArcGIS.so.1.0 ./release64/libMYLIB.so.1

Я получаю следующие ошибки (есть еще много, я взял верхпросто чтобы дать представление:

/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_muldi3.o): In function `__multi3':
(.text+0x0): multiple definition of `__multi3'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_muldi3.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_negdi2.o): In function `__negti2':
(.text+0x0): multiple definition of `__negti2'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_negdi2.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_lshrdi3.o): In function `__lshrti3':
(.text+0x0): multiple definition of `__lshrti3'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_lshrdi3.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_ashldi3.o): In function `__ashlti3':
(.text+0x0): multiple definition of `__ashlti3'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_ashldi3.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_ashrdi3.o): In function `__ashrti3':
(.text+0x0): multiple definition of `__ashrti3'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_ashrdi3.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_cmpdi2.o): In function `__cmpti2':
(.text+0x0): multiple definition of `__cmpti2'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_cmpdi2.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_ucmpdi2.o): In function `__ucmpti2':
(.text+0x0): multiple definition of `__ucmpti2'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_ucmpdi2.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_clear_cache.o): In function `__clear_cache':
(.text+0x0): multiple definition of `__clear_cache'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_clear_cache.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_enable_execute_stack.o): In function `__enable_execute_stack':
(.text+0x0): multiple definition of `__enable_execute_stack'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_enable_execute_stack.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_absvsi2.o): In function `__absvsi2':
(.text+0x0): multiple definition of `__absvsi2'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_absvsi2.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_absvsi2.o): In function `__absvdi2':
(.text+0x20): multiple definition of `__absvdi2'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_absvsi2.o):(.text+0x20): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_absvdi2.o): In function `__absvti2':
(.text+0x0): multiple definition of `__absvti2'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_absvdi2.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_addvsi3.o): In function `__addvsi3':
(.text+0x0): multiple definition of `__addvsi3'
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_addvsi3.o):(.text+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/libgcc.a(_addvsi3.o): In function `__addvdi3':

Обновление

Статические библиотеки, которые я пытаюсь объединить:

-rw-rw-r-- 1 mehoggan mehoggan  487770 Jan  3 11:17 libfreetype.a
-rw-rw-r-- 1 mehoggan mehoggan  227814 Jan  3 11:17 libjpeg.a
-rw-rw-r-- 1 mehoggan mehoggan  258576 Jan  3 11:17 libpng.a
-rw-rw-r-- 1 mehoggan mehoggan 2392136 Jan  3 11:17 libSkia.a
-rw-rw-r-- 1 mehoggan mehoggan  696756 Jan  3 11:17 libSQlite.a
-rw-rw-r-- 1 mehoggan mehoggan 1517832 Jan  3 11:16 libSymbolXLib.a
-rw-rw-r-- 1 mehoggan mehoggan  928934 Jan  3 11:17 libxml2.a

Я выполнил отдельную компиляцию для каждого из файлов, поэтому ссылки не выполнялись. Я просмотрел исходный код и не вижу ничего, связанного с libgcc. Именно поэтому ошибка не возникает со мной.

Ответы [ 2 ]

14 голосов
/ 14 февраля 2013

Вам не хватает закрытия --no-whole-archive.То есть

    gcc --shared  \
    -m64 \
    -Wl,--whole-archive ./release64/*.a -Wl,--no-whole-archive \
    -o ./release64/libMYLIB.so.1.0
    ln -sf libArcGIS.so.1.0 ./release64/libMYLIB.so
    ln -sf libArcGIS.so.1.0 ./release64/libMYLIB.so.1

Без закрывающей --no-whole-archive начальная --whole-archive повлияет на все библиотеки, передаваемые компоновщику, в частности libgcc, который всегда передается неявно.Вот почему вы получаете повторяющиеся символы.

1 голос
/ 03 января 2012

Это означает только то, что сказано. Существует два или более файлов .a, которые содержат файлы .o, которые содержат определения этих функций. В частности, это выглядит так, как будто ваш каталог содержит либо два варианта libgcc.a, либо что-то, содержащее его копию.

Не делайте этого с libgcc.a вообще. Чтобы опустить libgcc, добавьте -nostdlib или даже -nodefaultlibs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...