如何使用 mysql 连接器创建共享对象库 (*.so)?

How to create a shared object library (*.so) with mysql connector?

我用 C 编写了一个非常简单的应用程序,为此我想与 MySQL 数据库建立连接。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <mysql.h>
#include <my_global.h>

void runtime_tile_opt(void); 


int main(void) {
    runtime_tile_opt();
    return 0;
}


void runtime_tile_opt() {
    printf("MySQL client version: %s\n", mysql_get_client_info());

}

如果我 运行 gcc -o runtime $(mysql_config --cflags) runtime.c $(mysql_config --libs),一切正常,所有库似乎都正确 linked,如果我 运行 可执行文件,我得到一个合法的- 外观输出:

MySQL client version: 5.5.49

不过,我想用它制作一个共享库。所以我试图创建一个目标文件,带有 -fPIC 标志:

gcc -c -fPIC runtime.c $(mysql_config --cflags) -o runtime.o $(mysql_config --libs)

mysql_config --libsmysql_config --cflags的输出是:

-L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -ldl
-I/usr/include/mysql -DBIG_JOINS=1  -fno-strict-aliasing    -g -DNDEBUG

最后,我创建了我的 .so

gcc runtime.o -shared -o runtime.so

以上所有操作都没有任何错误。但是,有些库显然没有 linked,因为当我 运行 加载了这个插件的文件时,我得到:

/home/michal/thesis/Drafts/runtime/runtime.so: undefined reference to `mysql_get_client_info'

这个函数是在我包含的头文件中定义的。我对 gcc 不是很有经验,但我看了一下它,看起来我 link 编辑了我必须 link 的内容。有什么想法我在哪里失败了吗?

您仍然需要在创建共享库时将正确的 -l 标志传递给编译器。它们应该与您在创建二进制文件时传递的标志相同,即

gcc -shared -o runtime.so $(mysql_config --cflags) runtime.o $(mysql_config --libs)

注意选项的顺序很重要!首先传递所有选项,然后传递所有文件,最后传递库(-l... 个操作数)。