Russian Qt Forum
Ноябрь 24, 2024, 04:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: приложение на C++ и библиотека на C (решено)  (Прочитано 17974 раз)
theorist
Гость
« : Октябрь 12, 2010, 18:32 »

написал на C++ в Qt Creator программу, использующую две библиотеки, написанные на C++. проблем с этим нет.

теперь в программе нужно использовать библиотеку, написанную на C [http://sourceforge.net/projects/libcue/].

добавил в файл проекта:

Код:
LIBS += -lcue
INCLUDEPATH += /usr/include/libcue-1.3/libcue

добавил в один из файлов заголовков:

Код:
extern "C" {
    #include <cdtext.h>
}

и компилятор начинает выдавать ошибки, причём ругается на библиотеки, написанные на C++.

видимо, я неправильно пытаюсь использовать библиотеку на C. подскажите, пожалуйста, как сделать правильно.
« Последнее редактирование: Ноябрь 02, 2010, 09:16 от theorist » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Октябрь 12, 2010, 20:21 »

Директива extern "C" делает немного не то, что вы думаете.
Для компилера нет разницы между с++ и си библиотеками. Кроме того, с++ обратно совместим с си - вы просто подключаете хедер/библиотеку не заботясь о том, на каком языке они написаны (с или с++)
Записан
theorist
Гость
« Ответ #2 : Октябрь 12, 2010, 20:53 »

допустим, что так. я убрал extern, но ошибки всё равно выдаются те же. как быть?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Октябрь 12, 2010, 22:53 »

Может вы хоть ошибки процитируете?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Октябрь 12, 2010, 23:23 »

Директива extern "C" делает немного не то, что вы думаете.
Для компилера нет разницы между с++ и си библиотеками.

Для линкера есть, С имена заманглятся, и линкер их не найдёт. Поэтому C заголовки заворачивают в extern "C". А правильные авторы сишной библиотеки даже напишут в заголовке

Код
C++ (Qt)
#ifdef __cplusplus
extern "C" {
#endif
 
int a(void);
void b(int);
 
#ifdef __cplusplus
}
#endif
 

Кроме того, с++ обратно совместим с си - вы просто подключаете хедер/библиотеку не заботясь о том, на каком языке они написаны (с или с++)

не 100% совместим, плюс потому что см. выше.

Автор - покажи ошибки. Кстати используй pkgconfig в .pro, так удобнее библиотеки добавлять в проект, и универсальнее. У меня, например, не libcue-1.3, а libcue-1.4:

Код
C++ (Qt)
CONFIG += link_pkgconfig
PKGCONFIG += libcue
 
« Последнее редактирование: Октябрь 12, 2010, 23:27 от Alex Custov » Записан
theorist
Гость
« Ответ #5 : Октябрь 13, 2010, 07:29 »

ошибки:

Код:
In file included from /usr/include/sys/stat.h:107,
from /usr/include/CLucene/StdHeader.h:76,
from /usr/include/CLucene.h:11,
from retriever.h:8,
from tablemodel.h:12,
from tableview.h:14,
from mainwindow.h:9,
from mainwindow.cpp:5:
/usr/include/bits/stat.h:88: error: field ‘st_atim’ has incomplete type
/usr/include/bits/stat.h:89: error: field ‘st_mtim’ has incomplete type
/usr/include/bits/stat.h:90: error: field ‘st_ctim’ has incomplete type
/usr/include/bits/stat.h:149: error: field ‘st_atim’ has incomplete type
/usr/include/bits/stat.h:150: error: field ‘st_mtim’ has incomplete type
/usr/include/bits/stat.h:151: error: field ‘st_ctim’ has incomplete type

повторяю, если не пытаться использовать libcue, то эти ошибки не возникают.

А правильные авторы сишной библиотеки даже напишут в заголовке

Код
C++ (Qt)
#ifdef __cplusplus
extern "C" {
#endif
 
int a(void);
void b(int);
 
#ifdef __cplusplus
}
#endif
 

может быть, дело в том, что этого нет в cdtext.h?
Записан
gogi
Гость
« Ответ #6 : Октябрь 13, 2010, 10:27 »

ошибки:

Код:
In file included from /usr/include/sys/stat.h:107,
from /usr/include/CLucene/StdHeader.h:76,
from /usr/include/CLucene.h:11,
from retriever.h:8,
from tablemodel.h:12,
from tableview.h:14,
from mainwindow.h:9,
from mainwindow.cpp:5:
/usr/include/bits/stat.h:88: error: field ‘st_atim’ has incomplete type
/usr/include/bits/stat.h:89: error: field ‘st_mtim’ has incomplete type
/usr/include/bits/stat.h:90: error: field ‘st_ctim’ has incomplete type
/usr/include/bits/stat.h:149: error: field ‘st_atim’ has incomplete type
/usr/include/bits/stat.h:150: error: field ‘st_mtim’ has incomplete type
/usr/include/bits/stat.h:151: error: field ‘st_ctim’ has incomplete type

повторяю, если не пытаться использовать libcue, то эти ошибки не возникают.

А правильные авторы сишной библиотеки даже напишут в заголовке

Код
C++ (Qt)
#ifdef __cplusplus
extern "C" {
#endif
 
int a(void);
void b(int);
 
#ifdef __cplusplus
}
#endif
 

может быть, дело в том, что этого нет в cdtext.h?

Попробуй инклудануть <time.h> (только перед  #include <cdtext.h>)
Записан
theorist
Гость
« Ответ #7 : Октябрь 13, 2010, 10:50 »

Попробуй инклудануть <time.h> (только перед  #include <cdtext.h>)
не помогло
Записан
gogi
Гость
« Ответ #8 : Октябрь 13, 2010, 11:47 »

Попробуй инклудануть <time.h> (только перед  #include <cdtext.h>)
не помогло

А ошибки изменились? Просто поле st_atim имеет тип который определён в time.h, а хидер bits/stat.h его сам не инклудит.
Записан
gogi
Гость
« Ответ #9 : Октябрь 13, 2010, 11:55 »

Посмотрел я этот cdtext.h(благо он маленький)
Там есть
Код:
 typedef struct Cdtext Cdtext;
И struct Cdtext нигде не определяется. Может тебе ещё чего подключить надо?
Записан
theorist
Гость
« Ответ #10 : Октябрь 13, 2010, 11:58 »

А ошибки изменились? Просто поле st_atim имеет тип который определён в time.h, а хидер bits/stat.h его сам не инклудит.
всё то же самое
Записан
theorist
Гость
« Ответ #11 : Октябрь 13, 2010, 12:05 »

Может тебе ещё чего подключить надо?
может быть, но только что?
Записан
gogi
Гость
« Ответ #12 : Октябрь 13, 2010, 12:15 »

Может тебе ещё чего подключить надо?
может быть, но только что?
Ну не знаю, я с этой библиотекой не работал. Почитай на неё доку, погрепай где её исходники на Cdtext.
Записан
theorist
Гость
« Ответ #13 : Октябрь 13, 2010, 12:34 »

Ну не знаю, я с этой библиотекой не работал. Почитай на неё доку, погрепай где её исходники на Cdtext.
у неё документации нет. перепробовал все файлы заголовков, где есть Cdtext. ничего не изменилось.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #14 : Октябрь 13, 2010, 14:56 »

у неё документации нет. перепробовал все файлы заголовков, где есть Cdtext. ничего не изменилось.

Выкладывай самый маленький компилябельный пример
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.217 секунд. Запросов: 22.