如何使用 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 --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
以上所有操作都没有任何错误。但是,有些库显然没有 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...
个操作数)。
我用 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 --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
以上所有操作都没有任何错误。但是,有些库显然没有 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...
个操作数)。