如何进行部分链接?

时间:2011-12-24 07:15:42

标签: c static linker

在我的示例C代码中,我使用 mysqlclient 连接到MySQL服务器。这是 Makefile

example: example.c
    $(CC) $< -o $@ `mysql_config --cflags --libs`

工作正常。但是生成的示例动态的链接,这不是我想要的。我想做的是链接 libmysqlclient static ally,同时链接其他库 dynamic ally,例如 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

1 个答案:

答案 0 :(得分:0)

幸运的是,我有一些闪电来消灭这个死气沉沉的帖子。也许它会活着......

您的MySQL安装将带有两个库,一个共享,一个静态。您需要做的就是显式链接静态库而不是共享库。不幸的是mysql_config可能在这里无法帮助,所以你必须自己找到它,但它可能在`/usr/lib/libmysqlclient.a'中。所以这样做:

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

(其中...etc...mysql_config --libs发出的所有其余输出。)

.a扩展名表明它是一个静态库;我们使用完整路径名而不是-lmysqlclient来强制编译器使用静态版本而不是它通常喜欢的动态版本。