用ctypes调用C++函数:qmake与GCC编译结果不一致问题
问题:GCC与qmake编译C++库后ctypes调用结果不一致
背景
我正在开展一个用ctypes实现Python与C库交互的项目(注:我了解ctypes原本设计用于C而非C),参照教程完成实现后,使用GCC编译C++库时,pytest测试可成功通过。但因后续需集成QT,改用qmake编译后,调用getPoint函数返回的Point结构体成员x、y值均为0,测试失败。
C++代码(clibrary.cpp)
// clibrary.cpp #include <stdio.h> extern "C" struct Point { int x; int y; }; extern "C" struct Point *getPoint(struct Point point_a) { struct Point point_result; struct Point *ptr; ptr = &point_result; ptr->x = point_a.x + 10; ptr->y = point_a.y + 10; return ptr; } extern "C" void printPoint(struct Point p) { printf("%d %d\n", p.x, p.y); } int main() { return 0; }
GCC编译命令
gcc -shared -o /Users/guadi/wrapper/src/clibrary.so /Users/guadi/wrapper/src/clibrary.cpp
Python代码
structs.py
# structs.py import ctypes class Point(ctypes.Structure): _fields_ = [("x", ctypes.c_int), ("y", ctypes.c_int)]
test_clibrary.py(GCC编译时的版本)
# test_clibrary.py import ctypes from ctypes import CDLL from ctypes.util import find_library import pytest from src.compiler import compile_lib, SRC from src.structs import Point def test_get_point(capsys): source = "/Users/guadi/wrapper/src/clibrary.so" cdll = CDLL(source) cdll.getPoint.restype = ctypes.POINTER(Point) cdll.getPoint.argtypes = (Point,) point_a = Point(10, 20) p = cdll.getPoint(point_a) # Print point members and assert values are right print(p.contents.x, p.contents.y) captured = capsys.readouterr() assert captured.out == "20 30\n"
qmake编译后的问题表现
测试失败的错误信息:
AssertionError: assert '0 0\n' == '20 30\n'
qmake相关配置
编译命令
qmake src/clibrary.pro && make
clibrary.pro项目文件
TEMPLATE = lib QT += core SOURCES += clibrary.cpp
修改后的test_clibrary.py代码
仅调整了库路径的获取方式:
source = find_library("clibrary")
我使用的是macOS系统,请问为何用qmake和GCC编译后程序表现不同?
内容的提问来源于stack exchange,提问作者Guadalupe Romero
相关产品推荐
相关产品推荐

