IT World
IT World

Reputation: 165

How can I call a c++ function using python

I want to know if there's a way to use a c++ function inside a python code

For example, after doing my research I did find this solution using .dll file. But It can't find the function My code:

fun.cpp:

#include <iostream>
extern int add(int a, int b) {
return a+b;
}
int main()
{
    std::cout << "Hello World! from C++" << std::endl;
    return 0;
}

compiling it using cmd:

g++ fun.cpp -o fun.dll

Calling the function using Python, ctypes:

from ctypes import *
import os
mydll = cdll.LoadLibrary("C:/Users/User/Desktop/ctypes/fun.dll")

result= mydll.add(10,1)
print("Addition value:-"+result)

But I had this error:

Traceback (most recent call last): File "c:\Users\User.vscode\extensions\ms-python.python-2019.10.41019\pythonFiles\ptvsd_launcher.py", line 43, in main(ptvsdArgs) File "c:\Users\User.vscode\extensions\ms-python.python-2019.10.41019\pythonFiles\lib\python\old_ptvsd\ptvsd__main__.py", line 432, in main run() File "c:\Users\User.vscode\extensions\ms-python.python-2019.10.41019\pythonFiles\lib\python\old_ptvsd\ptvsd__main__.py", line 316, in run_file runpy.run_path(target, run_name='main') File "C:\Python36\lib\runpy.py", line 263, in run_path pkg_name=pkg_name, script_name=fname) File "C:\Python36\lib\runpy.py", line 96, in _run_module_code mod_name, mod_spec, pkg_name, script_name) File "C:\Python36\lib\runpy.py", line 85, in _run_code exec(code, run_globals) File "c:\Users\User\Desktop\ctypes\test.py", line 5, in result= mydll.add(10,1) File "C:\Python36\lib\ctypes__init__.py", line 361, in getattr func = self.getitem(name) File "C:\Python36\lib\ctypes__init__.py", line 366, in getitem func = self._FuncPtr((name_or_ordinal, self)) AttributeError: function 'add' not found

Upvotes: 1

Views: 564

Answers (2)

triplekimchi
triplekimchi

Reputation: 1

I think you should check Python's LoadLibrary is calling "fun.dll"'s main() function correctly. It should look for the DllMain() function when loading, then you need to get the function address to call the function.

Upvotes: -1

Mark Tolonen
Mark Tolonen

Reputation: 177406

C++ mangles exported names. Here's an example that should compile on Windows and Linux. __declspec(dllexport) is required to export a function on Windows, but not Linux. extern "C" is required to export the function name using C conventions, instead of the name-mangled C++ conventions. The name-mangling is required in C++ to indicate the function parameters and return type, since C++ can have multiple functions with the same name but take different parameters. The C convention does not support multiple functions with the same name.

fun.cpp:

#ifdef _WIN32
#   define API __declspec(dllexport)
#else
#   define API
#endif

extern "C" API int add(int a, int b) {
    return a+b;
}

Python:

from ctypes import *

dll = CDLL('fun')
result = dll.add(10,1)
print('Addition value:',result)

Output:

Addition value: 11

Upvotes: 3

Related Questions