我制作了一个项目,其中包含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
来构建它。
当我尝试使用这个cmake文件以纯C++方式运行它时,它可以正常运行,它会显示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