Python/C++扩展,在链接库时出现未定义符号错误

3

我制作了一个项目,其中包含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
1个回答

0

对于遇到类似问题的任何人,您需要指定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"',
       ],
)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接