Как найти «мой» каталог lib? - PullRequest
2 голосов
/ 24 марта 2012

Я занимаюсь разработкой программы на C ++ под Linux.Я хочу поместить некоторые вещи (в частности, файлы битового кода LLVM, но это не важно) в библиотеки, поэтому мне нужна следующая структура каталогов:

/somewhere/bin/myBin
/somewhere/lib/myLib.bc

Как мне найти каталог lib?Я пытался вычислить относительную часть из argv[0], но если /somewhere в моем PATH, argv[0] будет содержать myBin.Есть ли способ получить этот путь?Или я должен установить его во время компиляции?

Как GNU autotools справляется с этим?Что будет, если я добавлю опцию --prefix для ./configure?

Редактировать: Слово library в моем случае немного вводит в заблуждение.Моя библиотека состоит из битового кода LLVM, поэтому это не фактический (общий) объектный файл, а просто файл, который я хочу открыть из моей программы.Вы можете думать об этом как об изображении или текстовом файле.

Ответы [ 6 ]

1 голос
/ 24 марта 2012

может быть, что вы хотите:

/usr/lib 

ссылка на каталог unix: http://www.comptechdoc.org/os/linux/usersguide/linux_ugfilestruct.html

0 голосов
/ 24 марта 2012

Вы можете использовать системный вызов readlink на /proc/self/exe, чтобы получить путь к вашему исполняемому файлу.Затем вы можете использовать realpath и т. Д.

0 голосов
/ 24 марта 2012

Обращаясь только к части вопроса «как GNU autotools справляется с этим?» ...

Когда вы назначаете --prefix для настройки, в основном происходят две вещи: 1) она сообщает системе сборки, что все должно быть установлено в $ {prefix}, и 2) она выглядит в $ {prefix} / share / config.site для любой дополнительной информации о том, как настроена система (этот файл обычно не существует). Он абсолютно ничего не помогает в поиске библиотек, но зависит от того, правильно ли пользователь настроил цепочку инструментов. Если вы хотите использовать библиотеку в / foo / lib, у вас должна быть настроена цепочка инструментов для ее просмотра (например, добавив / foo / lib в /etc/ld.so.conf или указав -L / foo / lib в LDFLAGS и "/ foo / lib" в LD_LIBRARY_PATH)

Сценарий configure полагается на то, что вы настроили среду. Это не помогает вам настроить эту среду, но помогает, предупреждая вас, что вы этого не сделали.

0 голосов
/ 24 марта 2012

Список каталогов для поиска хранится в файле /etc/ld.so.conf.

В Linux переменная окружения LD_LIBRARY_PATH - это набор каталогов, разделенный двоеточиями, в котором библиотеки следует искать в первую очередь, перед стандартным набором каталогов; это полезно при отладке новой библиотеки или использовании нестандартной библиотеки для специальных целей.

LD_LIBRARY_PATH удобно для разработки и тестирования:

$ export LD_LIBRARY_PATH=/path/to/mylib.so
$ ./myprogram

[читать дальше]

0 голосов
/ 24 марта 2012

Вы должны будете использовать флаг компилятора, чтобы сообщить программе. Например, если у вас есть плагин dir:

# Makefile.am
AM_CPPFLAGS = -DPLUGIN_DIR=\"${pkglibdir}\"
bin_PROGRAMS = awesome_prog
pkglib_LTLIBRARIES = someplugin.la
0 голосов
/ 24 марта 2012

Предположим, что ваш каталог lib "../lib" относительно исполняемого файла

Сначала вам нужно определить, где находится myBin. Вы можете получить его, прочитав / proc / self / exe

Затем, конкаталируя путь к вашему двоичному файлу с "../lib", вы получите каталог lib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...