2011-12-24 5 views
1

В моем примере кода C я использую mysqlclient для подключения к серверу MySQL. Вот Makefile.Как сделать частичную ссылку?

example: example.c 
    $(CC) $< -o [email protected] `mysql_config --cflags --libs` 

Он отлично работает. Но изготовленный пример - динамический союзник, который не то, что я хочу. То, что я хочу сделать, это связать с libmysqlclient статический союзника, в то время как связь с другими библиотеками динамического союзника, такие как libz, libcrypto.

FYI. Выход mysql_config «ы с --cflags --libs:

$ mysql_config --cflags --libs 
-I/usr/include/mysql -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions \ 
-fstack-protector --param=ssp-buffer-size=4 -m64 -D_GNU_SOURCE \ 
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fwrapv 

-rdynamic -L/usr/lib64/mysql -lmysqlclient -lz -lcrypt -lnsl -lm \ 
-L/usr/lib64 -lssl -lcrypto 
+0

Возможный дубликат [Можно ли смешивать библиотеки статических и совместно используемых объектов при связывании?] (Http://stackoverflow.com/questions/2954387/cani-i-mix-static-and-shared-object-libraries-when -linking) –

ответ

0

К счастью, у меня есть некоторая молния ZAP этот мертвый пост с. Возможно, он будет жить ...

Ваша установка MySQL будет иметь две библиотеки: одну общую и одну статическую. Все, что вам нужно сделать, это явно связать статическую библиотеку, а не общую. К сожалению, mysql_config, вероятно, не может помочь здесь, поэтому вам придется самому найти его, но это, вероятно, будет в `/usr/lib/libmysqlclient.a '. Так что это:

$(CC) $< -o [email protected] /usr/lib/libmysqlclient.a `mysql_config --cflags` \ 
    -lz -lcrypt ...etc... 

(. Где ...etc... все остальное на выходе, что mysql_config --libs излучает)

Расширение .a указывает, что это статическая библиотека; мы используем полный путь, а не -lmysqlclient, чтобы заставить компилятор использовать статическую версию, а не динамическую версию рядом с ней, которую он обычно предпочитает.

Смежные вопросы