Я пытаюсь собрать 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 модулей.
В других дистрибутивах они обнаружены «из коробки». Но здесь это почему-то не работает.
Итак, у меня два вопроса:
Что они на самом деле упускают? Какой пакет я должен установить, чтобы он работал? (Я не знаком с аркой linux, но мне нужно, чтобы она там тоже работала)
Есть ли у вас какие-либо идеи, что следует добавить к 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
.....