Ctypes在使用CMake创建的共享库中找不到符号

Mav*_*ick 9 c c++ python ctypes cmake

我的CMake设置在linux中创建一个共享库是类似的

SET (CMAKE_CXX_FLAGS "-fPIC")

SET (LIB_UTILS_SRC
    Utils.cpp
)

ADD_LIBRARY (UTILS SHARED
    ${LIB_UTILS_SRC}
)
Run Code Online (Sandbox Code Playgroud)

Source Utils.cpp

double addTwoNumber(double x, double y)
{
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

尝试使用类似的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) )
Run Code Online (Sandbox Code Playgroud)

我收到一些消息.

AttributeError: /home/AP/workspace/LearningCPP/lib/libUTILS.so:
undefined symbol: addTwoNumber
Run Code Online (Sandbox Code Playgroud)

我使用"nm --demangle libUTILS.so"命令检查了libUTILS.so,它清楚地显示了"addTwoNumber"符号.

为什么我仍然从python中获取"未定义的符号"消息?我猜测必须要设置一些编译器标志,以便符号正确.任何建议将不胜感激!

Sam*_*lar 16

有趣的是,我通常使用numpy.ctypes,因为我经常要处理大型数据集,并从未有过任何问题,但我想我知道什么是怎么回事,它的名称是由G ++编译器的错位,我做了它的工作是这样的:

Makefile文件:

g++ -Wall -fPIC -O2 -c Utils.cpp
g++ -shared -Wl -o libUTILS.so Utils.o
Run Code Online (Sandbox Code Playgroud)

Utils.cpp

extern "C" double addTwoNumber(double x, double y)
{
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

输出:

$ python test.py
5.8
Run Code Online (Sandbox Code Playgroud)

注意,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)(第3点)版权所有(C)2007 Free Software Foundation,Inc.这是免费软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.

$ uname -a
Darwin MacBookPro 10.8.0 Darwin内核版本10.8.0:Tue Jun 7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386

  • 谢谢你.我遇到了同样的问题 - 结果我只需要`extern"C"`我的所有函数(在[使用C或C++扩展Python部分]的Python文档中也提到了这一点(http:// docs. python.org/2/extending/extending.html#writing-extensions-in-c)). (2认同)