Связывание архивов (.a) в общий объект (.so) - PullRequest
19 голосов
/ 29 октября 2011

Я компилирую файл общих объектов в archive.a:

$ g++ -c -Iinclude/ -fPIC -O0 -o object1.o source1.cpp
$ g++ -c -Iinclude/ -fPIC -O0 -o object2.o source2.cpp
$ ar rvs archive.a object1.o object2.o
r - object1.o
r - object2.o

Пока все хорошо. Полученный archive.a имеет хороший размер в несколько КБ. Дамп с nm показывает, что соответствующие объектные файлы содержатся в файлах.

Теперь я хочу скомпилировать несколько этих архивов в общий объектный файл.

g++ -g -O0 -Iinclude/ -I/usr/include/somelibrary -shared -o libLibrary.so archive1.a archive2.a

В результате мой файл библиотеки почти пуст :

$ nm -D libLibrary.so
                 w _Jv_RegisterClasses
0000000000201010 A __bss_start
                 w __cxa_finalize
                 w __gmon_start__
0000000000201010 A _edata
0000000000201020 A _end
0000000000000578 T _fini
0000000000000430 T _init

Есть идеи, что я делаю не так?


Edit:

Когда я пытаюсь переключиться на -Wl,--whole-archive, происходит следующее:

/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0xd): undefined reference to `__init_array_end'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_end' can not be used when making a shared object
/usr/bin/ld: final link failed: Bad value
collect2: ld returned 1 exit status
make: *** [libKeynect.so] Error 1

Ответы [ 2 ]

18 голосов
/ 29 октября 2011

символов / объектных файлов в файлах .a, которые не используются, будут отброшены компоновщиком.

Используйте -Wl,--whole-archive для ссылки, чтобы включить весь .a файл Отредактируйте, вам нужно будет добавить -Wl,--no-whole-archive после того, как вы также укажите свою библиотеку, так что все это будет -Wl,--whole-archive archive1.a archive2.a -Wl,--no-whole-archive

7 голосов
/ 15 декабря 2011

Относительно вашего редактирования: Поставьте «-Wl, - no-whole-archive» в конце команды link, которую вы запускаете.Это исправило это для меня.

...