Как связать статическую библиотеку в динамическую библиотеку в GCC - PullRequest
34 голосов
/ 16 апреля 2010

В gcc (g ++) я скомпилировал статическую библиотеку .a (назовите ее some_static_lib.a). Я хочу связать (это правильная фраза?) Этот .a файл с другой динамической библиотекой (назовите ее libsomeDyn.so), которую я создаю. Хотя .so компилируется, я не вижу содержимого .a в .so, используя команду nm:

/ usr / bin / g ++ -fPIC -g -O2 -Wall -Werror -pipe -march = pentium3 -mtune = prescott -MD -D_FILE_OFFSET_BITS = 64 -DLINUX -D_GNU_SOURCE -D_THREAD_SAFE -I ../../../../../../../../ -I ../../ ../../../../../..//libraries -Wl, -rpath, / usr / lib -o libsomeDyn.so some.o another.o some_static_lib.a -shared -Wl -x -Wl, -soname, libsomeDyn.so

Я не вижу функций в some_static_lib.a в libsomeDyn.so. Что я делаю не так?

Ответы [ 2 ]

42 голосов
/ 16 апреля 2010

Статические библиотеки имеют специальные правила, когда дело доходит до линковки. Объект из статической библиотеки будет добавлен в двоичный файл только в том случае, если объект предоставляет неразрешенный символ.

В Linux вы можете изменить это поведение с помощью опции компоновщика --whole-archive:

g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive
16 голосов
/ 11 августа 2011

Для каждого, кто сталкивается с такой проблемой, как я (и не понимает ответ правильно): вот краткое руководство по созданию динамической библиотеки (libmylib.so) из статической (mylib.a):

1.) Создайте файл mylib.c, который импортирует только файл mylib.h

2.), Скомпилируйте этот файл mylib.c в mylib.o с помощью

gcc -c -fPIC mylib.c -o msat.o

3.) создать динамическую библиотеку с помощью следующей команды:

gcc --whole-archive -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o mylib.a 

Это сработало по крайней мере для меня, превратив статическую библиотеку (скомпилированную с -fPIC) в динамическую библиотеку.Я не уверен, будет ли это работать для других библиотек.

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