'Loading C++ dll in python doesn't work with C++ libs

So I am trying to make a C/C++ dll for a project but any C++ library I include in my header, ends up causing loading problems when I try to load it using ctypes in python. I'm guessing maybe ctypes doesn't have c++ libs paths included?
I made a simple demonstration to my problem.

init2.h: Generic Header file for dll and execs using the dll

#ifndef INIT2_H
#define INIT2_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
void func11();

#ifdef __cplusplus
}
#endif

#endif

init2.cc: dll code (loads fine)

// This works fine
#include "init2.h"

void func11() {
    printf("Func11\n");
}

init.c: exe code that loads dll

#include "init2.h"

int main() {
    func11();
    return 0;
}

Makefile

CFLAGS = -Wall -std=c11 -g
CCFLAGS = -Wall -std=c++11 -g

all: libmain.dll main

main.o: init2.cc
    g++ $(CCFLAGS) init2.cc -fpic -c -o main.o

libmain.dll: main.o
    g++ $(CCFLAGS) -shared main.o -o libmain.dll

main: init.c
    gcc $(CFLAGS) -L. -lmain init.c -o main

clean: 
    del *.o *.exe *.dll *.txt

script.py

from ctypes import *

lib = CDLL('D:\Projects\Learning-C++\libmain.dll')
lib.func11()

The above compiles, links and loads fine in the generated main.exe and script.py. The problem occurs when I add a c++ lib in my dll.

init2.cc: With iostream (loads in main.exe only)

#include "init2.h"
#include <iostream>

void func11() {
    std::cout << "Func11\n";
}

Compiling that into the dll, while everything stays the same loads fine into the main.exe (init.c code) but gives me the following loading error in script.py.

Traceback (most recent call last):
  File "D:\Projects\Learning-C++\script.py", line 3, in <module>
    lib = CDLL('D:\Projects\Learning-C++\libmain.dll')
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3312.0_x64__qbz5n2kfra8p0\lib\ctypes\__init__.py", line 374, in __init__
    self._handle = _dlopen(self._name, mode)
FileNotFoundError: Could not find module 'D:\Projects\Learning-C++\libmain.dll' (or one of its dependencies). Try using the full path with constructor syntax.

How can I fix this? My bad if these seems obvious, but I'm fairly new to C++ and haven't got the integration down yet. Thanks in advance!



Solution 1:[1]

The problem was as I expected due to cdll not able to find the C++ library. The file name for my case was libstdc++-6.dll. Which is located in the bin folder in my compiler's directory. To make cdll search for the dependencies in that folder I did the following:

import os

# add dependency directory
os.add_dll_directory('C:\\Program Files\\CodeBlocks\\MinGW\\bin')

# load the dll 
lib = CDLL('D:\\Projects\\Learning-C++\\libmain.dll')
lib.func11()

The dll may have many dependencies located in other directories e.g. You defined libDLL.dll and bin/libDependency.dll. You will need to add the /path/to/dir/bin directory using the above method if you're trying to load libDLL.dll in python.
You can find all the dependencies of a dll using dependency walker or dumpbin /dependents libDLL.dll in the VS dev powershell.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Mazen Bahgat