Говоря 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 установлен в том же месте, что и вы.

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