繁体   English   中英

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

[英]Python/C++ Extension, Undefined symbol error when linking a library

我做了一个以 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 window:

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 文件。 我不认为这是通往 go 的方式,但我认为值得一提。

更好的更新:我删除了上面的更新并将这两行添加到我的扩展中:

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"',
       ],
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM