Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Ошибки в библиотеке LComp под linux

Вы не вошли.

 Поиск | Регистрация | Вход 

Роман
09.12.2013 17:41:40
#1

Гость

Ошибки в библиотеке LComp под linux

1) Если устройство уже открыто, то функция CreateInstance должна выставить errno в L_ERROR_INUSE. В реальности иногда в errno стоит EBUSY, и эта константа никак не проверяется в строках 61-66 файла maincomp.cpp

Добавил проверку на EBUSY:
if(LGetLastError()==EBUSY) LSetLastError(L_ERROR_INUSE);

Поидее здесь нужно описать каждую возможную константу, или для всех прочих выставлять L_ERROR.

2) Функция CreateInstance описана только в maincomp.cpp, и это порождает странный баг:
явным открытием библиотеки через dlopen ее можно получить, а с помощью стандартного линковщика ld нельзя, ругается на неизвестный символ.

g++ -shared test.o -o libtest.so -ldl /usr/lib/liblcomp.so

Если добавить заголовок функции в ifc_ldev.h, то линкуется и работает.

Я все сделал правильно, или есть решение лучше?

10.12.2013 09:36:48
#2

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,338

Re: Ошибки в библиотеке LComp под linux

Ну насчет lcomp не скажу. Но в C++, если линкуетесь к библиотеке через ld, то используемые функции в любом случае должны быть объявлены, так как реально экспортируемое из .so имя функции зависит от списка параметров (ведь могут быть перегруженные функции), т.е. если компилятор не знает списка параметров и типов, то и имя подберет неправильное (да и вообще использование функции без объявления - как минимум warning). Так что для линковки через ld Ваш вариант правильный (где именно объявлять технически понятно не принципиально). По-видимому в lcomp предполагается, что основной вариант использования - через dlopen, поэтому нет объявления.

Роман
10.12.2013 13:56:59
#3

Гость

Re: Ошибки в библиотеке LComp под linux

По пункту 1:
Сегодня при неподключенном через USB устройстве получил ENODEV.
Возможны и другие коды, которые никак не обрабатываются в библиотеке lcomp

10.12.2013 14:11:00
#4

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Ошибки в библиотеке LComp под linux

Так задумано.через dlopen в linux и LoadLibary в win. Чтобы не думать о lib файле. С обработкой ошибок в том месте вообще сложный момент - надо переосмыслить. Главное что NULL вернет.

Роман
12.12.2013 15:59:33
#5

Гость

Re: Ошибки в библиотеке LComp под linux

В вашем варианте dlopen вызывается вначале программы, а dlclose в конце.
А я линкую все динамические библиотеки через флаг ldl.:
g++ -shared test.o -o libtest.so -ldl /usr/lib/liblcomp.so
При этом происходит тоже-самое, и so гарантированно освобождается при закрытии приложения. А также происходит проверка сигнатур функций при компиляции, в вашем варианте только во время работы программы.

Мне видится такой подход гораздо удобнее и безопаснее. Но возможно с ним будут проблемы в windows, с их линковкой я мало знаком.

13.12.2013 12:25:21
#6

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Ошибки в библиотеке LComp под linux

я себе пометил. когда буду заниматься библиотекой посмотрю....