Ich versuche ein möglichst einfaches Beispiel zu verwenden um überhaupt erstmal irgendwas zum Laufen zu bringen. Ich möchte die Funktionen einer shared library in python nutzen:
Calc.h
#ifndef CALC_H
#define CALC_H
class Calc {
public:
int add();
};
#endif
Calc.cpp
#include "include/Calc.h"
int Calc::add() {
return 5;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(calc)
set(CMAKE_CXX_STANDARD 11)
# Define sources and executable
set(SOURCES Calc.cpp)
add_library(calc SHARED ${SOURCES})
target_link_libraries(calc ${LIBS} -Wl,--export-dynamic)
install(TARGETS calc DESTINATION lib)
install(FILES Calc.h DESTINATION include)
mkdir build && cd build && cmake .. && make
...
[100%] Linking CXX shared library libcalc.so
[100%] Built target calc
main.py
import ctypes
lib = ctypes.CDLL('./libcalc.so')
lib.add.restype = ctypes.c_int
result = lib.add()
print(result)
...$ python3 main.py
Traceback (most recent call last):
File ".../main.py", line 7, in <module>
lib.add.restype = ctypes.c_int
File "/usr/local/lib/python3.9/ctypes/__init__.py", line 387, in __getattr__
func = self.__getitem__(name)
File "/usr/local/lib/python3.9/ctypes/__init__.py", line 392, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: ./libcalc.so: undefined symbol: add <----------
Was mache ich falsch?