2012-03-24 5 views
2

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

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

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

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

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

+1

Если ваша библиотека статична, просто добавьте -L your/lib/dir; если он динамический, у вас может быть LD_LIBRARY_PATH и т. д. –

+0

Как я уже сказал, библиотека является файлом биткода LLVM, поэтому это не поможет. Подумайте об этом как о изображении или текстовом файле, который я хочу прочитать из своей программы. –

ответ

1

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

/usr/lib 

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

+0

Да и знаю. В идеале я хочу иметь возможность перемещать программу независимо от того, что я хочу, так что/usr/lib в порядке, если двоичный файл находится в/usr/bin. Моя программа будет интегрирована в среду разработки стула в моем университете, и они используют разные пути, например. выпускать и отлаживать двоичные файлы. –

0

Предположим, ваш Lib каталог "../lib" по отношению к исполняемым

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

После этого ваш путь двоичного файла с помощью «../lib» предоставит вам директиву lib гу.

+0

Это должно работать, но я стараюсь избегать кода, зависящего от платформы. –

0

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

# Makefile.am 
AM_CPPFLAGS = -DPLUGIN_DIR=\"${pkglibdir}\" 
bin_PROGRAMS = awesome_prog 
pkglib_LTLIBRARIES = someplugin.la 
+0

Это кажется разумным. Теперь мне нужно только выяснить, как преобразовать ваш пример в scons. –

0

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

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

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

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

[read more]

+0

Библиотека - это бит-код LLVM, поэтому я не могу это использовать. –

0

Обращаясь только часть вопроса "? Как 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

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

Смежные вопросы