You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:05:30