【问题标题】:How to do partial linking?如何进行部分链接?
【发布时间】:2011-12-24 07:15:42
【问题描述】:

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

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

它工作正常。但是生成的 exampledynamically 链接的,这不是我想要的。我想要做的是链接到 libmysqlclient statically,同时链接到其他库 dynamically,例如 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

【问题讨论】:

标签: c static linker


【解决方案1】:

幸运的是,我有一些闪电可以用来消除这个死帖。也许它会活着......

您的 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,来强制编译器使用静态版本,而不是它通常喜欢的动态版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多