Говоря omake использовать статическую версию библиотеки a c
Я использую Omake для создания собственного двоичного исполняемого файла. После того, как он связывается, и я пытаюсь запустить его, он не запускается, выдавая следующую ошибку:
ошибка при загрузке общих библиотек: libprotobuf-c.so.1: невозможно открыть общий объектный файл: такого файла или каталога нет
Есть ли способ, во время компиляции, сказать исполняемому файлу, что нужно выбрать статическую версию: libprotobuf-ca, а не разделяемую?
2 ответа
Кажется, что нет глобального флага, который можно передать ld, компоновщику, который заставляет компоновщик предпочитать статические библиотеки динамическим библиотекам, когда они доступны. В моем случае я установил имя библиотеки явно так:
OCAML_LINK_FLAGS += -cclib -l:libprotobuf-c.a
Я не знаком с omake
но я верю флагу ocamlc
вы ищете это dllpath
:
-dllpath dir
Adds the directory dir to the run-time search path for shared C libraries. At link-
time, shared libraries are searched in the standard search path (the one corresponding
to the -I option). The -dllpath option simply stores dir in the produced executable
file, where ocamlrun(1) can find it and use it.
Если вы можете настроить omake
пройти соответствующий -dllpath
аргумент к ocamlc, вы должны быть хорошо идти.
Под капотом я считаю, что это с помощью rpath
функция (путь поиска библиотеки времени выполнения) из ld
компоновщик GNU. Смотрите https://linux.die.net/man/1/ld. Также есть chrpath
утилита для изменения rpath
уже построенного исполняемого файла.
Другой вариант - запустить ваш исполняемый файл с LD_LIBRARY_PATH
установите так, чтобы разделяемая библиотека находилась в пути загрузки. Вы также можете установить общедоступную библиотеку, если это необходимо. Последний вариант - загрузить библиотеку вручную при загрузке приложения с использованием dlopen
,
Правильный выбор зависит от того, как вы будете распространять это и от того, кому вы будете распространять это, если вообще. Имейте в виду, если вы используете rpath
/dllpath
конечный пользователь вряд ли будет иметь protobuf
установлен в том же месте, что и вы.