ld не может найти функции, связанные с python -модулями, при сборке на arch linux - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь собрать https://gitlab.com/dhyannataraj/goblin-camp/-/tree/cmake-build проект (cmake-build ветка), он использует python2.7 и использует cmake в качестве системы сборки.

Для дистрибутивов на основе Debian все работает нормально Но для arch- linux весь код компилируется хорошо, но когда дело доходит до связывания, возникает проблема

[ 35%] Linking CXX executable goblin-camp
/usr/bin/ld: CMakeFiles/goblin-camp.dir/Goblin_Camp/src/scripting/Engine.cpp.o: in function `Script::Init(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)':
Engine.cpp:(.text+0x310): undefined reference to `inittime'
/usr/bin/ld: Engine.cpp:(.text+0x315): undefined reference to `init_functools'
/usr/bin/ld: Engine.cpp:(.text+0x31a): undefined reference to `initcStringIO'
/usr/bin/ld: Engine.cpp:(.text+0x31f): undefined reference to `initzlib'

Все эти inittime, init_functools, initcStringIO и initzlib они являются частью python модулей.

В других дистрибутивах они обнаружены «из коробки». Но здесь это почему-то не работает.

Итак, у меня два вопроса:

  1. Что они на самом деле упускают? Какой пакет я должен установить, чтобы он работал? (Я не знаком с аркой linux, но мне нужно, чтобы она там тоже работала)

  2. Есть ли у вас какие-либо идеи, что следует добавить к CMakeLists.txt, чтобы обнаружить эту проблему на этапе настройки ?

Обновление: Мне кажется, что я нашел причину проблемы.

В дистрибутивах на основе Debain все двоичные файлы python модули собраны в файле /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0. Между тем в Arch Linux они встроены отдельно в /usr/lib/python2.7/lib-dynload, и cmake и компоновщик их не находят.

Решением было заставить cmake импортировать каждый модуль

add_library(python_zlib SHARED IMPORTED)
set_property(TARGET python_zlib PROPERTY IMPORTED_LOCATION "/usr/lib/python2.7/lib-dynload/zlib.so")

add_library(python_datetime SHARED IMPORTED)
set_property(TARGET python_datetime PROPERTY IMPORTED_LOCATION "/usr/lib/python2.7/lib-dynload/datetime.so")

add_library(python__functools SHARED IMPORTED)
set_property(TARGET python__functools PROPERTY IMPORTED_LOCATION "/usr/lib/python2.7/lib-dynload/_functools.so")

add_library(python_cStringIO SHARED IMPORTED)
set_property(TARGET python_cStringIO PROPERTY IMPORTED_LOCATION "/usr/lib/python2.7/lib-dynload/cStringIO.so")

и они добавляют его в качестве аргумента к target_link_libraries

target_link_libraries("goblin-camp"
  python_zlib
  python_datetime
  python__functools
  python_cStringIO
.....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...