我的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中获取"未定义的符号"消息?我猜测必须要设置一些编译器标志,以便符号正确.任何建议将不胜感激!
此代码发布于http://accu.org/index.php/cvujournal,2013年 7月发行.我无法理解输出,任何解释都会令人担忧
#include <iostream>
int x;
struct i
{
i() {
x = 0;
std::cout << "--C1\n";
}
i(int i) {
x = i;
std::cout << "--C2\n";
}
};
class l
{
public:
l(int i) : x(i) {}
void load() {
i(x);
}
private:
int x;
};
int main()
{
l l(42);
l.load();
std::cout << x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
--C1
0
Run Code Online (Sandbox Code Playgroud)
我在期待:
--C2
42
Run Code Online (Sandbox Code Playgroud)
任何解释?
我遇到了如下所示的一些情况,其中每个类都需要另一个类,并且它创建了循环依赖。我在使用 ctypes 包装一些 c 代码时遇到了这种类型的情况。已经有很多关于这个主题的帖子,但我觉得它们没有帮助,我需要一些例子。有关解决此问题的任何想法/示例都会有所帮助。
# Module A
from B import C2
class C1(object):
def __init__(self):
self.name = "C1"
self.c2 = C2()
# Module B
from A import C1
class C2(object):
def __init__(self):
self.name = "C2"
self.c1 = C1()
# Main
from A import C1
if __name__ == "__main__":
o = C1()
print o.name
Run Code Online (Sandbox Code Playgroud) python circular-dependency circular-reference cyclic-reference