【问题标题】:Ctypes not finding symbols in shared library created using CMakeCtypes 在使用 CMake 创建的共享库中找不到符号
【发布时间】:2012-06-28 01:45:18
【问题描述】:

我在 linux 中创建共享库的 CMake 设置类似于

SET (CMAKE_CXX_FLAGS "-fPIC")

SET (LIB_UTILS_SRC
    Utils.cpp
)

ADD_LIBRARY (UTILS SHARED
    ${LIB_UTILS_SRC}
)

源 Utils.cpp

double addTwoNumber(double x, double y)
{
    return x + y;
}

当尝试使用 CType 访问“addTwoNumber”函数时

import os
import ctypes as c

libPath = '/home/AP/workspace/LearningCPP/lib/libUTILS.so'
libUTILS = c.cdll.LoadLibrary(libPath)

prototype = c.CFUNCTYPE(    
    c.c_double,                
    c.c_double,                
    c.c_double                
)
addTwoNumber = prototype(('addTwoNumber', libUTILS))

res = addTwoNumber(c.c_double(2.3), c.c_double(3.5) )

我收到了一些类似的消息。

AttributeError: /home/AP/workspace/LearningCPP/lib/libUTILS.so:
undefined symbol: addTwoNumber

我使用“nm --demangle libUTILS.so”命令检查了 libUTILS.so,它清楚地显示了其中的“addTwoNumber”符号。

为什么我仍然收到来自 python 的“未定义符号”消息? 我猜必须设置一些编译器标志,以便正确处理符号。任何建议将不胜感激!

【问题讨论】:

    标签: c++ python c cmake ctypes


    【解决方案1】:

    有趣的是,我通常使用numpy.ctypes,因为我经常需要处理大型数据集,而且从来没有遇到过任何问题,但我想我知道这里发生了什么,就是名称被 g++ 编译器弄乱了,我让它这样工作:

    生成文件:

    g++ -Wall -fPIC -O2 -c Utils.cpp
    g++ -shared -Wl -o libUTILS.so Utils.o
    

    Utils.cpp

    extern "C" double addTwoNumber(double x, double y)
    {
        return x + y;
    }
    

    test.py

    import os
    import ctypes as c
    
    libUTILS = c.cdll.LoadLibrary('libUTILS.so')
    
    prototype = c.CFUNCTYPE(    
        c.c_double,                
        c.c_double,                
        c.c_double                
    )
    addTwoNumber = prototype(('addTwoNumber', libUTILS))
    
    res = addTwoNumber(c.c_double(2.3), c.c_double(3.5) )
    print res
    

    输出:

    $ python test.py
    5.8
    

    注意extern 关键字,这可以确保编译器不会破坏名称,在windows 下你必须做一些额外的事情,我确实找到了http://wolfprojects.altervista.org/dllforpyinc.php,这很有趣。

    我希望这会有所帮助。

    我的机器:

    $ g++ --version
    i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3) 版权所有 (C) 2007 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有 保修单;甚至不是为了适销性或特定用途的适用性。

    $ unname -a
    达尔文 MacBookPro 10.8.0 达尔文内核版本 10.8.0:2011 年 6 月 7 日星期二 16:33:36 PDT; root:xnu-1504.15.3~1/RELEASE_I386 i386

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-04
    • 2015-10-03
    • 1970-01-01
    • 2021-07-17
    • 2012-09-30
    • 1970-01-01
    • 2017-06-05
    • 2021-04-12
    相关资源
    最近更新 更多