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



我用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: %sn", mysql_get_client_info());
}

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

MySQL client version: 5.5.49

但是,我想用它创建一个共享库。所以我正在尝试创建一个带有-fPIC标志的对象文件:

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

mysql_config --libs mysql_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

以上所有内容都没有出现任何错误。但是,某些库显然没有链接,因为当我运行加载了此插件的文件时,我得到:

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

此函数在我包含的头文件中定义。我对 gcc 不是很有经验,但我看着它,看起来好像我链接了我必须链接的内容。任何想法我在哪里失败了?

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

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

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

最新更新