小编Mav*_*ick的帖子

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中获取"未定义的符号"消息?我猜测必须要设置一些编译器标志,以便符号正确.任何建议将不胜感激!

c c++ python ctypes cmake

9
推荐指数
1
解决办法
8223
查看次数

以下代码的输出是什么?

此代码发布于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)

任何解释?

c++ struct

7
推荐指数
1
解决办法
613
查看次数

如何解决 Python 中的这种循环依赖

我遇到了如下所示的一些情况,其中每个类都需要另一个类,并且它创建了循环依赖。我在使用 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

0
推荐指数
1
解决办法
5551
查看次数