mysql - 无法链接到静态 mysqlclient 库,尽管共享库有效
问题描述
我有一个示例程序来熟悉 mysqlclient API。但是,当我编译并将其静态链接到 mysqlclient 库(.a
文件)时,链接器抱怨它找不到该文件,尽管它存在于我的路径中。链接到共享库(.dylib
我的 Mac 上的文件)有效。请帮助我了解这种行为。非常感激!
client.c
这是我调用 mysqlclient 库的驱动程序。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <mysql.h>
int main(int argc, char **argv)
{
MYSQL *mysql = NULL;
if (mysql_library_init(argc, argv, NULL)) {
fprintf(stderr, "could not initialize MySQL client library\n");
exit(1);
}
mysql = mysql_init(mysql);
if (!mysql) {
puts("Init faild, out of memory?");
return EXIT_FAILURE;
}
if (!mysql_real_connect(mysql, /* MYSQL structure to use */
NULL, /* server hostname or IP address */
NULL, /* mysql user */
NULL, /* password */
NULL, /* default database to use, NULL for none */
0, /* port number, 0 for default */
NULL, /* socket file or named pipe name */
CLIENT_FOUND_ROWS /* connection flags */ )) {
puts("Connect failed\n");
} else {
const char *query = "SELECT VERSION()";
if (mysql_real_query(mysql, query, strlen(query))) {
printf("Query failed: %s\n", mysql_error(mysql));
} else {
puts("Query OK");
}
}
mysql_close(mysql);
mysql_library_end();
return EXIT_SUCCESS;
}
这是我编译它的方法
gcc -I /usr/local/Cellar/mysql/8.0.16/include/mysql client.c -L /usr/local/Cellar/mysql/8.0.16/lib/ -l mysqlclient.a
ld: library not found for -lmysqlclient.a
clang: error: linker command failed with exit code 1 (use -v to see invocation)
编译没有.a
成功,因为它链接到共享库,而不是静态库。
最后,这是我的库文件:
ls /usr/local/Cellar/mysql/8.0.16/lib/libmysqlclient*
/usr/local/Cellar/mysql/8.0.16/lib/libmysqlclient.21.dylib /usr/local/Cellar/mysql/8.0.16/lib/libmysqlclient.a /usr/local/Cellar/mysql/8.0.16/lib/libmysqlclient.dylib
解决方案
这个论点:
-l mysqlclient.a
导致链接器查找名为libmysqlclient.a.a
. 相反,你想要这样的东西:
gcc -I /usr/local/Cellar/mysql/8.0.16/include/mysql client.c /usr/local/Cellar/mysql/8.0.16/lib/mysqlclient.a
推荐阅读
- typescript - `Exact 的目的是什么
` @graphql-codegen 创建的类型? - angular - 如何用角度实现有状态(REST API)?
- javascript - 用 $ 字符替换字符串中的所有数字
- python-3.x - 如何在不停止 while 循环的情况下运行 time.sleep()
- javascript - 在odoo 14中更改字段值后显示确认对话框
- python - 某些应用程序按钮仅在鼠标移动后可用
- c# - 如何使矩形停留在图片框上的某个位置并缩放
- azure-devops - 从 Azure kubernetes 集群中托管的 grafana 发送电子邮件警报
- tensorflow - TensorRT int8 模型装载中止
- dart - 如何从扩展类覆盖 toMap 方法