"Неопределенная ссылка на dlopen" при статическом соединении с gcc
После прочтения большого количества документации gcc и подобных вопросов моя проблема остается.
Я пытаюсь статически связать мой libluajit.a с моим проектом, но независимо от того, какую комбинацию команд я пробую, появляется та или иная ошибка. Я успешно скомпилировал мой проект с динамическим связыванием.
Прямо сейчас у меня нет идей, вот что я получил прямо сейчас:
gcc_options = -std=c++11 -static -pthread
src_dir = LuaHost
src_files = $(src_dir)/*.cpp
src_files += $(src_dir)/*.h
src_files += $(src_dir)/LuaSrc/*.h
src_files += $(src_dir)/LuaSrc/*.hpp
lib_cmd = -Wl,--no-as-needed -ldl -L./$(src_dir)/LuaSrc/ -lluajit
#compile everything and output an executeable
all:
g++ $(gcc_options) $(src_files) $(lib_cmd) -o LuaJITSandbox.o
И вот некоторые из ошибок:
./LuaHost/LuaSrc/libluajit.a(lj_clib.o): In function `lj_clib_index':
lj_clib.c:(.text+0x1c0): undefined reference to `dlsym'
./LuaHost/LuaSrc/libluajit.a(lj_clib.o): In function `lj_clib_load':
lj_clib.c:(.text+0x2c8): undefined reference to `dlopen'
lj_clib.c:(.text+0x350): undefined reference to `dlerror'
lj_clib.c:(.text+0x424): undefined reference to `dlopen'
Libluajit.a был скомпилирован на той же машине, RaspberryPi.
1 ответ
Я думаю -static
это не то, что вы после. -static
будет строить static application
и не значит link this static library to the application
,
Здесь есть несколько вариантов. Когда вы связываетесь с -lluajit
Вы могли бы удалить динамический .so
версия библиотеки. По умолчанию gcc будет использовать динамическое связывание, но откатится на статическое связывание, когда динамическая библиотека недоступна или не найдена.
Вместо -lluajit
Вы можете просто указать на файл статической библиотеки напрямую - обрабатывая его как объектный входной файл: /usr/lib/libluajit.a
,
Я думаю, что рекомендуемый способ - рассказать компоновщику, как связать вашу библиотеку. Попробуйте использовать -Wl,-Bstatic -lluajit
, Вы можете переключаться между Bstatic
а также Bdynamic
прямо перед именем библиотеки, если вы ссылаетесь на несколько библиотек и хотите связать их по-разному.