2011-12-24 50 views
1

在我的C代碼示例中,我使用mysqlclient連接到MySQL服務器。這裏是Makefile如何做部分鏈接?

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

它工作正常。但生產的示例動態盟友鏈接,這不是我想要的。我想要做的是對的libmysqlclient靜態盟友鏈接,而鏈接到的其他庫動態盟友,如libz進行libcrypto

僅供參考。 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/can-i-mix-static-and-shared-object-libraries-when -linking) – 2011-12-24 23:06:35

回答

0

幸運的是我有一些閃電扎普這個死後用。也許它會活...

你的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來強制編譯器使用靜態版本,而不是它通常喜歡的動態版本。