Расширение Python/C++, ошибка неопределенного символа при связывании библиотеки

Я сделал проект с glfw в качестве библиотеки, мой каталог выглядит так:

main_dir
|--include
|--|--glfw_binder.h
|--src
|--|--glfw_binder.cpp
|--lib
|--|--glfw
|--|--|--src
|--|--|--|--libglfw.so
|--|--|--|--libglfw.so.3
|--|--|--|--libglfw.so.3.3
|--|--|--|--...
|--|--|--include
|--|--|-- ...
|--main.cpp
|--setup.py
|--test.py

Я установил glfw с его веб-сайта и просто распаковал в каталог lib/. Затем я побежал cmake -G "Unix Makefiles", а затем make, чтобы построить его.

Когда я пытаюсь запустить его как чистый C++ с этим файлом cmake, он работает нормально, он отображает окно glfw:

cmake_minimum_required(VERSION 3.0)
project(Test)

add_subdirectory(lib/glfw)

find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

add_executable(Test main.cpp src/glfw_binder.cpp)

target_link_libraries(Test PRIVATE 
    ${PYTHON_LIBRARIES}
    glfw
)

А вот как выглядит мой setup.py:

from setuptools import setup, Extension, find_packages

module1 = Extension('test',
                    sources = ['main.cpp', 'src/glfw_binder.cpp'],
                    include_dirs=["include", "lib/glfw/include"],
                    library_dirs=["lib/glfw"],
                    libraries=["lib/glfw"],
                    extra_link_args=["lib/glfw"]
                    )

setup (name = 'python_test',
       version = '1.0',
       description = 'This is a demo package',
       packages=find_packages("glfw"),
       ext_modules = [module1]
       )

Затем я бегу python3 setup.py build, а за ним sudo python3 setup.py install. Он прекрасно создает файлы so. Затем я запускаю этот тестовый код:

import test

test.create_glfw_window()

Когда я запускаю этот скрипт через python3 test.py, я получаю эту ошибку:

Traceback (most recent call last):
  File "/home/turgut/Desktop/TestDir/Python-Binder-Test/test.py", line 3, in <module>
    import test
ImportError: /usr/local/lib/python3.10/dist-packages/python_test-1.0-py3.10-linux-x86_64.egg/test.cpython-310-x86_64-linux-gnu.so: undefined symbol: glfwDestroyWindow

Это не относится к glfwDestroyWindow, это относится ко всем функциям glfw. Как я должен связать это?

Обновление: я добавил эти строки:

       packages=['glfw'],
       package_dir = {'glfw': 'lib/glfw'},
       #package_data = {'glfw': ['lib/glfw/src/*.so']},
       package_data = {'glfw': ['lib/glfw/src/libglfw.so', "lib/glfw/src/libglfw.so.3", "lib/glfw/src/libglfw.so.3.3"]},

Теперь это дает мне следующую ошибку:

ImportError: libglfw.so.3: cannot open shared object file: No such file or directory

Хотя я указал все файлы .so вместе. Я не думаю, что это правильный путь, но я подумал, что стоит упомянуть.

Лучшее обновление: Я удалил вышеуказанное обновление и добавил эти две строки в свое расширение:

include_dirs=["include", "lib/glfw/include"],
       #extra_link_args=[ "-lm", "-lGL", "-lGLU", "-lglfw"],
       library_dirs=["lib/glfw"],
       libraries=['glfw']

и теперь я получаю эту ошибку, которая, как мне кажется, ближе к тому, что я ищу:

/usr/bin/ld: cannot find -lglfw: No such file or directory
collect2: error: ld returned 1 exit status
error: command '/usr/bin/x86_64-linux-gnu-g++' failed with exit code 1
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
351
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для тех, кто сталкивается с подобной проблемой, вам нужно указать runtime_library_dirs, чтобы файл setup.py выглядел так:

from setuptools import setup, Extension, find_packages


module1 = Extension('nerveblox',
       sources = ['main.cpp', 'src/nerveblox_VM.cpp'],
       include_dirs=["include", "lib/glfw/include"],
       #extra_link_args=[ "-lm", "-lGL", "-lGLU", "-lglfw"],
       library_dirs=["lib/glfw/src"],
       libraries=['glfw', 'GL'],
       runtime_library_dirs=['lib/glfw/src']
)


setup (
       name = 'Nerveblox_python_test',
       version = '1.0',
       description = 'This is a demo package',

       ext_modules = [module1],
       install_requires=[
        'importlib-metadata; python_version == "3.8"',
       ],
)

Другие вопросы по теме