|
|
  |
Linux начинающему |
|
|
|
Nov 17 2013, 08:10
|
Частый гость
 
Группа: Участник
Сообщений: 123
Регистрация: 22-03-10
Пользователь №: 56 115

|
Забыл отписаться. Скомпилировал её, не мытьем, так катаньем. В дистрибутиве виджета есть 2 папки с исходниками. Одна (gtk) собственно с исходниками библиотеки, вторая (glade) - с исходниками привязки библиотеки к Glade. Глейдом я не пользуюсь (пока во всяком случае), поэтому взял *.с и *.h из папки gtk и скомпилировал их своим makefile (точнее своим cmake) в динамическую библиотеку. Проверил, всё работает, а на glade - пофиг. Тем временем, наткнулся на другой Gtk библиотеку для отображения графиков http://sourceforge.net/projects/giw/. Тут поинтереснее уже. Плюсом к графикам есть стрелочные, столбиковые индикаторы. прикольно, надо будет попробовать. Но это так, к слову. Попутно хочу вот еще что спросить. Как, в общих чертах, переносится программа на целевую машину. Допустим, программа написана для АРМ. Программа использует дин. библиотеки. Как быть с этими библиотеками ? 1. Копировать с инструменталки готовые (кросскомпилированные) библиотеки в файловую систему линукса АРМа ? или 2. Их надо прям на самой плате компилировать, нативным, АРМовским gcc ? или 3. Или как ? Если первый вариант, то как это правильно делать ? Ну не руками же их папок выдергивать .so файлы и перетаскивать ? Если второй вариант, то не будет ли проблем с совместной работой программы, собранной кросскомпилятором инструменталки и библиотеками, собранными компилятором Линукса целевой платы ? Еще вопросик. Дистрибутив Линукса АРМ платы собирается на инструменталке тем же компилятором, которым в последствие будут компилироваться программы пользователя или нет? Спасибо!
|
|
|
|
|
Nov 18 2013, 12:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(berkl @ Nov 17 2013, 12:10)  Забыл отписаться. Скомпилировал её, не мытьем, так катаньем. В дистрибутиве виджета есть 2 папки с исходниками. Одна (gtk) собственно с исходниками библиотеки, вторая (glade) - с исходниками привязки библиотеки к Glade. Глейдом я не пользуюсь (пока во всяком случае), поэтому взял *.с и *.h из папки gtk и скомпилировал их своим makefile (точнее своим cmake) в динамическую библиотеку. Проверил, всё работает, а на glade - пофиг. Тем временем, наткнулся на другой Gtk библиотеку для отображения графиков http://sourceforge.net/projects/giw/. Тут поинтереснее уже. Плюсом к графикам есть стрелочные, столбиковые индикаторы. прикольно, надо будет попробовать. Но это так, к слову. Попутно хочу вот еще что спросить. Как, в общих чертах, переносится программа на целевую машину. Допустим, программа написана для АРМ. Программа использует дин. библиотеки. Как быть с этими библиотеками ? 1. Копировать с инструменталки готовые (кросскомпилированные) библиотеки в файловую систему линукса АРМа ? или 2. Их надо прям на самой плате компилировать, нативным, АРМовским gcc ? или 3. Или как ? Если первый вариант, то как это правильно делать ? Ну не руками же их папок выдергивать .so файлы и перетаскивать ? Если второй вариант, то не будет ли проблем с совместной работой программы, собранной кросскомпилятором инструменталки и библиотеками, собранными компилятором Линукса целевой платы ? Еще вопросик. Дистрибутив Линукса АРМ платы собирается на инструменталке тем же компилятором, которым в последствие будут компилироваться программы пользователя или нет? Спасибо! Я пользуюсь первым методом. Скомпилировав и установив в sandbox я потом просто копирую все в корень моей target машины. На второй вопрос ответ такой. Я так и делаю, но не уверен, что не может быть нюансов.
|
|
|
|
|
Nov 19 2013, 06:36
|
Частый гость
 
Группа: Участник
Сообщений: 123
Регистрация: 22-03-10
Пользователь №: 56 115

|
Цитата(Tarbal @ Nov 18 2013, 16:51)  Я пользуюсь первым методом. Скомпилировав и установив в я потом просто копирую все в корень моей target машины. На второй вопрос ответ такой. Я так и делаю, но не уверен, что не может быть нюансов. Спасибо А если Вы установили с десяток всяких библиотек на свою плату и вообще настроили АРМовый Линукс под себя. Можно ли сохранить его в таком состоянии, чтобы потом на вторую плату не устанавливать опять всё по шаг за шагом, а разом прошить всё в NAND или SD карточку?
|
|
|
|
|
Nov 19 2013, 12:31
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(berkl @ Nov 19 2013, 09:36)  Спасибо
А если Вы установили с десяток всяких библиотек на свою плату и вообще настроили АРМовый Линукс под себя. Можно ли сохранить его в таком состоянии, чтобы потом на вторую плату не устанавливать опять всё по шаг за шагом, а разом прошить всё в NAND или SD карточку? Скопируйте образ диска и потом записывайте ее. Копирование образа сопряжено с использованием команды dd, которая не прощает ошибок. Можно скопировать только файловую систему. 1. создаем две директории: mkdir mnt; mkdir rootfs 2. Монтируем партишн в которой наша рут файловая система (/dev/sdc1 может быть другая буква вместо с и другая цифра. Вы сами найдите какая партишн появляется в вашей системе. Если не знаете как, то я расскажу.) sudo mount /dev/sdc1 mnt 3. Копируем с приведенными ключами команды. sudo scp -arp mnt/* rootfs sync 4. Размонтируем и убираем диск. sudo umount /dev/sdc1 5. Вставляем диск, с созданной и отформатированной партишн. Монтируем партишн sudo mount /dev/sdc1 mnt Копируем на диск. sudo scp -arp rootfs/* mnt sync sudo umount /dev/sdc1 Вынимаем готовый диск. На самом деле иногда бывает надо записать еще кернел и бут лоадер. Но это уже другой вопрос. После команды sync компьютер может надолго задуматься. Это нормально. надо дождаться, окончания команды. Это было для SD карточки. Если же память впаяна и нет возможности стартануть систему с внешней SD карточки или USB диска, то надо создать копию вашей файловой системы на каком-нибудь компьютере, а бут лоадер сконфигурировать (точнее командную строку кернела), чтобы при старте кернел монтировал эту удаленную рут файловую систему по NFS. Установите свои библиотеки уже после этого. Кстати зачастую сорсы библиотек не нужны. Возможно неплохо будет удалить их перед копированием.
|
|
|
|
|
Jan 6 2014, 16:06
|
Частый гость
 
Группа: Участник
Сообщений: 123
Регистрация: 22-03-10
Пользователь №: 56 115

|
Приветствую, Вопрос такой. Можно ли собрать проект на большом Линуксе с объектниками библиотек, скаченных с Линукса целевой платы? Прям взять по SSH скачать нужные для сборки либы и подсунуть их кросскомпилятору К примеру, есть у меня в программе что-нибудь графическое на "иксах" Код ....display = XOpenDisplay(0);..... Я выкачиваю из борды Xlib.so и подсовываю её кросстулчейну инструменталки. Будет такое работать  ? Спасибо!
|
|
|
|
|
Jan 6 2014, 21:07
|
Частый гость
 
Группа: Участник
Сообщений: 123
Регистрация: 22-03-10
Пользователь №: 56 115

|
Цитата(Lagman @ Jan 6 2014, 23:15)  Извините, я вас не понял  . По существу вопроса выскажитесь плиз
|
|
|
|
|
Jan 7 2014, 11:03
|

Частый гость
 
Группа: Участник
Сообщений: 136
Регистрация: 7-01-09
Из: Нефтеюганск
Пользователь №: 42 967

|
Цитата(berkl @ Jan 6 2014, 22:06)  К примеру, есть у меня в программе что-нибудь графическое на "иксах" Код ....display = XOpenDisplay(0);..... Я выкачиваю из борды Xlib.so и подсовываю её кросстулчейну инструменталки. Будет такое работать  ? Если в принципе — да (вот пример подобного для gcc). А вот в корпусе вам ведь ещё потребуются заголовочные файлы от этой библиотеки.
--------------------
С уважением, Алексей Шапошников.
|
|
|
|
|
Jan 7 2014, 11:50
|
Знающий
   
Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245

|
Цитата(berkl @ Jan 7 2014, 01:07)  Извините, я вас не понял  . По существу вопроса выскажитесь плиз Я дал направление, что есть два вида библиотек, в вашем случае это динамическая библиотека, и дал ссылку как надо открывать и работать с этим видом библиотек. Далее гуглояндекс в помощь. IMHO для кросскомпиляции эта .so вам не нужна, нужен заголовочный файл от этой библиотеки и правильно ее открыть и работать. http://www.ibm.com/developerworks/ru/libra...amic-libraries/
|
|
|
|
|
Jan 7 2014, 18:55
|
Частый гость
 
Группа: Участник
Сообщений: 123
Регистрация: 22-03-10
Пользователь №: 56 115

|
Цитата(Lagman @ Jan 7 2014, 15:50)  Я дал направление, что есть два вида библиотек, в вашем случае это динамическая библиотека, и дал ссылку как надо открывать и работать с этим видом библиотек. Далее гуглояндекс в помощь. IMHO для кросскомпиляции эта .so вам не нужна, нужен заголовочный файл от этой библиотеки и правильно ее открыть и работать. http://www.ibm.com/developerworks/ru/libra...amic-libraries/ Всё, я понял. Динамическую либу можно подключать к проекту как обычным способом (линковать make'ом, например), так и прям внутри кода своей программы (с помощью линуксовой либы dl ). В этом случае, для успешной компиляции программы, подключаемая библиотека живьем действительно не нужна. Да и заголовочник либы думаю нужен только если в нем дефайны какие-то есть. Ловко. Для кросскомпиляции, наверное надо скопировать на инструменталку с целевой платы файлы dl.so и dlfcn.h, в папку проекта и указать мэйку путь к ним. Иначе под arm не соберется. Нашел, dl есть прямо в кросс тулчейне, можно (и наверно правильно) использовать её. Может как то поизящней можно, незнаю. Вещь,чо! Спасибо!
Сообщение отредактировал berkl - Jan 7 2014, 19:27
|
|
|
|
|
Jan 10 2014, 11:02
|
Частый гость
 
Группа: Участник
Сообщений: 123
Регистрация: 22-03-10
Пользователь №: 56 115

|
Для использования Код void *dlopen( const char *file, int mode ); надо знать имя файла библиотеки. Как его можно узнать? В руководстве на библиотеку не всегда его можно найти, как тут, к примеру http://www.opennet.ru/docs/RUS/gtk-reference/ix01.html (будем считать что библиотека хоть и нестандартная, но идет предустановленной в дистрибутиве Линукса) Где брать имена файлов системных библиотек тоже не ясно. Например, как узнать в каком хххх.so находится функция Код sin(double x); ? Спасибо.
|
|
|
|
|
Jan 10 2014, 11:10
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(berkl @ Jan 10 2014, 15:02)  Например, как узнать в каком хххх.so находится функция Код sin(double x); ? Читайте доки, они рулез. Код $ man sin Код SIN(3) Linux Programmer's Manual
NAME sin, sinf, sinl - sine function
SYNOPSIS #include <math.h>
double sin(double x); float sinf(float x); long double sinl(long double x);
Link with -lm.
|
|
|
|
|
Jan 10 2014, 11:48
|
Частый гость
 
Группа: Участник
Сообщений: 123
Регистрация: 22-03-10
Пользователь №: 56 115

|
Цитата(andrew_b @ Jan 10 2014, 15:10)  Читайте доки, они рулез. Код $ man sin Код SIN(3) Linux Programmer's Manual
NAME sin, sinf, sinl - sine function
SYNOPSIS #include <math.h>
double sin(double x); float sinf(float x); long double sinl(long double x);
Link with -lm. Не, не. Мне не надо имя либы которое используется при линковке( -lm ) Мне надо узнать что double sin(double x); в libm.so находится Вот тут поднимался вопрос этот http://archlinux.org.ru/forum/topic/3665/. Предлагается использовать следующее Цитата # Ищем имя либы, по ф-ции gtk_init nm -DA *.so* | grep -w gtk_init У меня это не работает, выдает обшибку "nm: '*.so*': Нет такого файла"
Сообщение отредактировал berkl - Jan 10 2014, 11:56
|
|
|
|
|
Jan 10 2014, 13:43
|

Частый гость
 
Группа: Участник
Сообщений: 136
Регистрация: 7-01-09
Из: Нефтеюганск
Пользователь №: 42 967

|
Цитата(berkl @ Jan 10 2014, 17:48)  У меня это не работает, выдает обшибку "nm: '*.so*': Нет такого файла" man find: CODE ➜ ~ find /usr/lib -name '*gtk*so*' -type f -exec nm -DA '{}' \; |grep "gtk_init" /usr/lib/python2.6/dist-packages/gtk-2.0/gtk/_gtk.so: U gtk_init_check /usr/lib/libreoffice/program/libvclplug_gtk3lo.so: U gtk_init /usr/lib/libreoffice/program/libvclplug_gtk3lo.so: U gtk_init_check /usr/lib/libreoffice/program/libvclplug_gtklo.so: U gtk_init_check /usr/lib/alsaplayer/interface/libgtk2_interface.so: U gtk_init /usr/lib/alsaplayer/interface/libgtk2_interface.so:000000000003cf30 T _Z18interface_gtk_initv /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.800.6:000000000018a350 T gtk_init /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.800.6:000000000018a320 T gtk_init_check /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.800.6:000000000018a150 T gtk_init_with_args /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.22:000000000012a190 T gtk_init /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.22:000000000012a740 T gtk_init_add /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.22:000000000012a160 T gtk_init_check /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.22:0000000000129fa0 T gtk_init_with_args /usr/lib/x86_64-linux-gnu/libwx_gtk2u_core-2.8.so.0.8.0: U gtk_init_check /usr/lib/x86_64-linux-gnu/libwx_gtk2u_core-3.0.so.0.0.0: U gtk_init_check /usr/lib/python2.7/dist-packages/gtk-2.0/gtk/_gtk.so: U gtk_init_check
(В данном случае она ищет в директории /usr/lib все библиотечные файлы хоть как-то относящиеся к gtk и если находит, то запускает nm с соответствующим аргументом. Результат перенаправляется на вход команды grep).
--------------------
С уважением, Алексей Шапошников.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|