Я сделал проект с 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
Для тех, кто сталкивается с подобной проблемой, вам нужно указать 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"',
],
)