我在 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;
}
当尝试使用 CTypes 访问“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 的“ undefined symbol ”消息? 我猜必须设置一些编译器标志,以便符号正确处理。任何建议将不胜感激!
最佳答案
有趣的是,我通常使用 numpy.ctypes
,因为我经常需要处理大型数据集,而且从来没有遇到过任何问题,但我想我知道这里发生了什么,就是名称被 g++ 编译器破坏了,我让它以这种方式工作:
生成文件:
g++ -Wall -fPIC -O2 -c Utils.cpp
g++ -shared -Wl -o libUTILS.so Utils.o
实用程序.cpp
extern "C" double addTwoNumber(double x, double y)
{
return x + y;
}
测试.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) Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.$ uname -a
Darwin MacBookPro 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386
关于c++ - Ctypes 在使用 CMake 创建的共享库中找不到符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11237072/