"Неопределенная ссылка на 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 прямо перед именем библиотеки, если вы ссылаетесь на несколько библиотек и хотите связать их по-разному.

Другие вопросы по тегам