- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 python 中构建一个小型“概念证明”库系统,并希望由 c 扩展处理数据库(为了安全并阻止某人干预代码)
我编译了所有内容,现在有了我的 _databaseHandler.so 文件,但遗憾的是 python 在导入时崩溃
我的 C 代码
#include "library.h"
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
MYSQL connect(){
MYSQL *con = mysql_init(NULL);
const char *address = "rarehost.net";
const char *username = "MySQL-name";
const char *password = "MySQL-password";
const char *databaseName = "dbname";
const unsigned int port = 3306;
if(con == NULL){
fprintf(stderr, "%s\n", mysql_error(con));
exit(1);
}
if(mysql_real_connect(con, address, username, password, databaseName, port, NULL, 0) == NULL) {
fprintf(stderr, "%s\n", mysql_error(con));
} else{
return *con;
}
}
void finish_with_error(MYSQL *con)
{
fprintf(stderr, "%s\n", mysql_error(con));
mysql_close(con);
exit(1);
}
char* getCustomers() {
MYSQL con = connect();
if (mysql_query(&con, "SELECT * FROM cars")) {
finish_with_error(&con);
}
MYSQL_RES *result = mysql_store_result(&con);
int num_fields = mysql_num_fields(result);
MYSQL_ROW row;
while((row = mysql_fetch_row(result))) {
for (int i = 0; i < num_fields; ++i) {
printf("%s ", row[i] ? row[i] : "NULL");
/*return row[i] ? row[i] : "NULL";*/
}
printf("\n");
}
return "hi";
}
是的,我知道它只是返回 hi,这是为了测试目的,直到我设法将它导入 python。
#ifndef DATABASEHANDLER_LIBRARY_H
#define DATABASEHANDLER_LIBRARY_H
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
char* getCustomers();
#endif //DATABASEHANDLER_LIBRARY_H
我的接口(interface)文件
%module databaseHandler
%{
#include "library.h"
#include <mysql/mysql.h>
%}
char* getCustomers();
最后但并非最不重要的是我的makefile
_databaseHandler.so: library.o library_wrap.o
gcc -shared library.o library_wrap.o -o _databaseHandler.so
library.o:
gcc -c -fPIC library.c -I/usr/include/mariadb/mysql
library_wrap.o:
swig -python library.i
gcc -c -fPIC library_wrap.c -I/usr/include/python3.7
这是让我做噩梦的输出:
Traceback (most recent call last):
File "/home/user/CLionProjects/databaseHandler/databaseHandler.py", line 14, in swig_import_helper
return importlib.import_module(mname)
File "/usr/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 670, in _load_unlocked
File "<frozen importlib._bootstrap>", line 583, in module_from_spec
File "<frozen importlib._bootstrap_external>", line 1043, in create_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
ImportError: /home/user/CLionProjects/databaseHandler/_databaseHandler.so: undefined symbol: mysql_query
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 1, in <module>
import databaseHandler
File "/home/user/CLionProjects/databaseHandler/databaseHandler.py", line 17, in <module>
_databaseHandler = swig_import_helper()
File "/home/user/CLionProjects/databaseHandler/databaseHandler.py", line 16, in swig_import_helper
return importlib.import_module('_databaseHandler')
File "/usr/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ImportError: /home/user/CLionProjects/databaseHandler/_databaseHandler.so: undefined symbol: mysql_query
(python 程序只是 import 和 print("hello") 函数)
最佳答案
由于您的库使用 mysql 中的函数,因此您需要在链接时将该库与适当的库链接。 (还有其他方法可以安排在运行时定义符号,但这是迄今为止最明智的选择)
因此,在您的 Makefile 中,您需要添加如下内容:
_databaseHandler.so: library.o library_wrap.o
gcc -shared library.o library_wrap.o -o _databaseHandler.so -lmysql -L/path/to/lib
(您需要提供确切的库名称和路径以从您用来提供它的包中链接,如果不清楚,通常有一个 pkgconfig 文件可以帮助解决这个问题或一些文档)。
关于python - python 导入 'undefined symbol: mysql_query' 上的 SWIG 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66247835/
我正在制作一个 C++ 库的包装器,以便它可以从 Java 中使用,我正在用 Swig 做这个。 我面临的是我有一个类(class) SomeClass ,它有一些重载的方法( someMethod
我有许多要在 SWIG 中重命名的类。我的大部分类(class)看起来像这样some_class ,我想将其重命名为 SomeClass .这很简单: %replace("%(camelcase)s"
PyPy 有一些 compatibility limitations ,尤其是关于 CPython C API。 我用 QuickFix预编译的 SWIG 绑定(bind)附带的包,我正在考虑将它与
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
使用 SWIG 生成接口(interface)模块时,生成的 C/C++ 文件包含大量静态样板函数。因此,如果想通过在同一个应用程序中使用许多单独编译的小接口(interface)来模块化 SWIG
我正在应用 SWIG 手册中有关嵌套类的解决方法,该部分使用全局内部类。在这里,我将向您展示一个类似于手册中的版本,但为您尽可能地简化了。我还必须将内联定义 {} 添加到 method(),因为没有它
我有一个现有的库 (JPhysX),它是原生 C++ 库 (PhysX) 的 Java 包装器。 Java 库使用 SWIG 生成的类型,例如 com.jphysx.SWIGTYPE_p_NxStre
有没有办法动态向下转换 swig 对象的 swig 代理? 这样做的原因是为了模拟 C++ 向下转换,但纯粹来自 python。例如,典型的 C++ 用法是 MyBase* obj = new MyB
我在远程服务器上工作,所以我在本地安装了 swig,使用 -prefix=/home/user/directory。 我有一个来自同事的 makefile,其中包含以下命令: swig $(SWIG_
据我所知,在用于将 c++ 文件编译为 python 扩展模块的 .i 文件中,我们可以添加一些 python 代码,如下所示(来自 example for adding additional pyt
我的 Swig 文件 (.i) 中有以下代码: %extend vgSofa::handler::VertexShape { vgd::Shp createVSWithNode( so
我有一个用 swig 包装的类的 C++ 代码。我无法修改代码或包装。在 python 中,我使用 ctypes 拥有一个指向所述 C++ 类的实例的指针。如何围绕该指针创建一个 swig 包装器?
我开始掌握 SWIG 的窍门,SWIG 的最新版本 (v3.0) 似乎可以处理我开箱即用所需的一切,包括 C++11 功能,但我遇到了麻烦开始在我的导演类(class)中使用 shared_ptr。
我正在使用 javacode 类型映射来添加一些附加函数来代替 SWIG 生成的函数。我想删除 SWIG 为 unsigned char mac[6]; 生成的默认 getter 和 setter(p
我正在使用 SWIG 为我的 C 库生成 Python 语言绑定(bind)。我已经设法构建了绑定(bind)和导出的数据结构,但在使用该库时我不得不跳过一些障碍。 例如,C 头文件的数据类型和函数原
我最近在node-js应用程序中从jade模板引擎切换到了swig。在使用jade时我使用了命令 jade.render('/sample.jade',{obj:object});渲染模板并传递对象。
我在我的 python 代码中发现了瓶颈,尝试了 Psycho 等。然后决定编写一个 c/c++ 扩展来提高性能。 在 swig 的帮助下,您几乎不需要关心参数等。一切正常。 现在我的问题是:swig
由于 SWIG 无法解析 __attribute__((packed))在我想包装的一些 C 结构上,我通过放置一个 #define __attribute__(x) 在我的.i文件。 这什么时候会来
我有一个包含 C++ header 的 SWIG 文件。 痛饮文件: %module my_module %{ #include "my_c_file.h" %} %include "my_c_fil
我正在尝试学习如何使用 SWIG,并且想知道我是否正在执行一些不需要执行的额外步骤。我目前有文件 Dog.cpp、Dog.h 和 Dog.i。我正在尝试使用 SWIG 包装 Dog.cpp 以便在 P
我是一名优秀的程序员,十分优秀!