寫kNN,須要在python中實現kd-tree
思考了一下,在python下寫這種算法類的東西,仍是十分別扭
因而但願用ctypes調用一下c++動態加載庫python
因而嘗試實現一下c++
// test.cpp long long fact(int n){ return (n<=0):1:(fact(n-1)*n); } // gcc -shared -fpic test.cpp -o libtest.so
// test.py import ctypes lib=ctypes.cdll.LoadLibrary("libtest.so") print(lib.fact(10))
因而報錯算法
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.6/ctypes/__init__.py", line 361, in __getattr__ func = self.__getitem__(name) File "/usr/lib/python3.6/ctypes/__init__.py", line 366, in __getitem__ func = self._FuncPtr((name_or_ordinal, self)) AttributeError: libtest.so: undefined symbol: fact
最後百度發現緣由是c++的編譯後,函數名會被改變(爲了實現重載)
用extern "C"聲明後,就會使用c的方式進行編譯,編譯後的文件中仍然是定義的函數名函數
解決方法code
// test,cpp // g++ -fpiv -shared test.cpp -o libtest.so extern "C"{ long long fact(int); } long long fact(int n){ return (n<=0):1:(fact(n-1)*n); }