Skip to content

Updating pybind and ImportError: dynamic module #153

@davidebenato

Description

@davidebenato

my code uses a very old version of pybind: 2.6.0 and everything works fine.
I have two modules, liba and libb

With 2.6.0 I have:

>>> import liba
>>> import libb
>>> 

Same code on 2.7.1 and higher, and I get the following error.
I didn't change one single line in the code.
Importing liba still works, but libb fails.

>>> import liba
>>> import libb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define module export function (PyInit_libb)

My module is correctly defined in a cpp file.

PYBIND11_MODULE(libb, m)

My CMake looks like this:

if (BUILD_SHARED_LIBRARY)
    set(TARGET_LINK_LIBS liba-shared Eigen3::Eigen)
    target_link_libraries(objlib PUBLIC ${TARGET_LINK_LIBS})
    find_package(Python REQUIRED COMPONENTS Interpreter Development)
    include_directories("${Python_INCLUDE_DIRS}")

    add_library(objlib-py OBJECT src/python/libb.cpp)
    SET(TARGET_LINK_LIBS_PY Python::Module pybind11::pybind11 ${TARGET_LINK_LIBS})
    target_include_directories(objlib-py PUBLIC ${TARGET_INCLUDE_DIRS})
    target_link_libraries(objlib-py PUBLIC ${TARGET_LINK_LIBS_PY})
    set_property(TARGET objlib-py PROPERTY POSITION_INDEPENDENT_CODE ON)

    set(SHARED_LIB ${CMAKE_PROJECT_NAME})
    add_library(${SHARED_LIB} SHARED $<TARGET_OBJECTS:objlib> $<TARGET_OBJECTS:objlib-py>)
    target_compile_definitions(${SHARED_LIB} PRIVATE VERSION_INFO=${PROJECT_VERSION})
    target_include_directories(${SHARED_LIB} PUBLIC ${TARGET_INCLUDE_DIRS})
    target_link_libraries(${SHARED_LIB} PUBLIC ${TARGET_LINK_LIBS_PY})
    list(APPEND RISK_TARGETS ${SHARED_LIB})
endif (BUILD_SHARED_LIBRARY)

And my environment:

$ python3 --version
Python 3.9.2
$ python3
Python 3.9.2 (default, Feb 28 2021, 17:03:44) 
[GCC 10.2.1 20210110] on linux

I compile my libs with gcc12

I am puzzled why upgrading the version of pybind makes my imports fail. Maybe I am doing something wrong, but I can't pinpoint it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions