Ссылки на библиотеки для исполняемого файла Linux - PullRequest
2 голосов
/ 20 января 2010

Я написал приложение на Java и успешно скомпилировал его, используя gcj . Это сработало на удивление хорошо, но я столкнулся с препятствием: я могу запустить исполняемый файл только через скрипт оболочки, потому что мне нужно указать пути к библиотекам.

Мне нужны библиотеки SWT, Xerces и GNU-crypto.

Есть ли способ статически связать библиотеки при компиляции в gcj, или это не очень хорошая идея? Или я могу указать (относительный) путь к библиотеке во время компиляции?

В настоящее время мой сценарий оболочки выглядит так:

#!/bin/sh
export LD_LIBRARY_PATH=./libs/:$LD_LIBRARY_PATH
exec ./MyJavaApp $*

Ответы [ 3 ]

3 голосов
/ 28 января 2010

Идея состоит в том, чтобы сделать статическое поле "sys_paths" пустым , чтобы оно создавало пути из измененного значения. Смотрите пост здесь (Пост # 223 от AjaySingh516) http://forums.sun.com/thread.jspa?messageID=3744346#3744346

Class clazz = ClassLoader.class;
Field field = clazz.getDeclaredField("sys_paths");
boolean accessible = field.isAccessible();
if (!accessible)
    field.setAccessible(true);
Object original = field.get(clazz);
// Reset it to null so that whenever "System.loadLibrary" is called, it
// will be reconstructed with the changed value.
field.set(clazz, null);
try {
    // Change the value and load the library.
    System.setProperty("java.library.path", "./libs/");
    System.loadLibrary("mylibapr");
} finally {
    // Revert back the changes.
    field.set(clazz, original);
    field.setAccessible(accessible);
}

.

Свойства системы gcj (См .: Стандартные свойства, поддерживаемые libgcj)

http://gcc.gnu.org/onlinedocs/gcj/System-properties.html

.

Решение # 2 : Установить системную переменную среды во время компиляции

http://linux.die.net/man/1/gcj

Для этого вы должны использовать параметр -Djava.library.path=./libs/ с gcj

Из руководства по gcj (ссылка выше):

- main = CLASSNAME

Эта опция используется при связывании для указания имени класса, чей «основной» метод должен вызываться при запуске результирующего исполняемого файла.

-dNAME [= значение]

Эта опция может использоваться только с "--main". Он определяет системное свойство с именем name и значением value. Если значение не указано, то по умолчанию используется пустая строка. Эти системные свойства инициализируются при запуске программы и могут быть получены во время выполнения с помощью метода "java.lang.System.getProperty".

Я никогда не работал с gcj, но в соответствии с документацией эти системные свойства могут быть получены во время выполнения, следовательно, он будет переносим и на другие системы.

Также см .: http://gcc.gnu.org/wiki/Statically_linking_libgcj?action=show&redirect=Statically+linking+libgcj

0 голосов
/ 20 января 2010

Почему вы используете AOT? Я бы предложил прочитать следующую статью . Один из недостатков, которые он упоминает для AOT, заключается в следующем ...

Динамические приложения. Классы, которые приложение загружает динамически во время выполнения, могут быть недоступны для разработчика приложения. Это могут быть сторонние плагины, динамические прокси и другие классы, сгенерированные во время выполнения и так далее. Таким образом, система времени исполнения должна включать интерпретатор байт-кода Java и / или JIT-компилятор.

0 голосов
/ 20 января 2010

Чтобы ответить на первую часть вашего вопроса -

со страницы руководства gcj: «Статическое связывание libgcj может привести к тому, что важные части libgcj будут опущены. Некоторые части libgcj используют отражение для загрузки классов во время выполнения. Поскольку компоновщик не видит эти ссылки во время ссылки, он может опустить упомянутые классы. обычно (но не всегда) «ClassNotFoundException» генерируется во время выполнения. При использовании этой опции необходимо соблюдать осторожность. "

Для статической компоновки других библиотек я не уверен. У меня не было причины сделать это.

Исполняемые файлы Linux отличаются от Windows. Обычно у вас есть «лаунчер» или что-то подобное в зависимости от того, какую именно оконную систему вы используете. Вы устанавливаете значок в этом, а не на сам исполняемый файл. Обычно сценарии запуска используются для установки любой среды, в которой вы нуждаетесь для запуска исполняемого файла. Опять же, все зависит от вашей конкретной оконной системы рабочего стола.

...