Russian Qt Forum

Программирование => С/C++ => Тема начата: theorist от Октябрь 12, 2010, 18:32



Название: приложение на C++ и библиотека на C (решено)
Отправлено: theorist от Октябрь 12, 2010, 18:32
написал на C++ в Qt Creator программу, использующую две библиотеки, написанные на C++. проблем с этим нет.

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

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

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

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

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

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

видимо, я неправильно пытаюсь использовать библиотеку на C. подскажите, пожалуйста, как сделать правильно.


Название: Re: приложение на C++ и библиотека на C
Отправлено: Авварон от Октябрь 12, 2010, 20:21
Директива extern "C" делает немного не то, что вы думаете.
Для компилера нет разницы между с++ и си библиотеками. Кроме того, с++ обратно совместим с си - вы просто подключаете хедер/библиотеку не заботясь о том, на каком языке они написаны (с или с++)


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 12, 2010, 20:53
допустим, что так. я убрал extern, но ошибки всё равно выдаются те же. как быть?


Название: Re: приложение на C++ и библиотека на C
Отправлено: Авварон от Октябрь 12, 2010, 22:53
Может вы хоть ошибки процитируете?


Название: Re: приложение на C++ и библиотека на C
Отправлено: Alex Custov от Октябрь 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
 


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 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?


Название: Re: приложение на C++ и библиотека на C
Отправлено: gogi от Октябрь 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>)


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 13, 2010, 10:50
Попробуй инклудануть <time.h> (только перед  #include <cdtext.h>)
не помогло


Название: Re: приложение на C++ и библиотека на C
Отправлено: gogi от Октябрь 13, 2010, 11:47
Попробуй инклудануть <time.h> (только перед  #include <cdtext.h>)
не помогло

А ошибки изменились? Просто поле st_atim имеет тип который определён в time.h, а хидер bits/stat.h его сам не инклудит.


Название: Re: приложение на C++ и библиотека на C
Отправлено: gogi от Октябрь 13, 2010, 11:55
Посмотрел я этот cdtext.h(благо он маленький)
Там есть
Код:
 typedef struct Cdtext Cdtext;
И struct Cdtext нигде не определяется. Может тебе ещё чего подключить надо?


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 13, 2010, 11:58
А ошибки изменились? Просто поле st_atim имеет тип который определён в time.h, а хидер bits/stat.h его сам не инклудит.
всё то же самое


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 13, 2010, 12:05
Может тебе ещё чего подключить надо?
может быть, но только что?


Название: Re: приложение на C++ и библиотека на C
Отправлено: gogi от Октябрь 13, 2010, 12:15
Может тебе ещё чего подключить надо?
может быть, но только что?
Ну не знаю, я с этой библиотекой не работал. Почитай на неё доку, погрепай где её исходники на Cdtext.


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 13, 2010, 12:34
Ну не знаю, я с этой библиотекой не работал. Почитай на неё доку, погрепай где её исходники на Cdtext.
у неё документации нет. перепробовал все файлы заголовков, где есть Cdtext. ничего не изменилось.


Название: Re: приложение на C++ и библиотека на C
Отправлено: Alex Custov от Октябрь 13, 2010, 14:56
у неё документации нет. перепробовал все файлы заголовков, где есть Cdtext. ничего не изменилось.

Выкладывай самый маленький компилябельный пример


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 13, 2010, 15:09
Выкладывай самый маленький компилябельный пример
с libcue? у меня так ничего и не получилось скомпилировать с его участием.


Название: Re: приложение на C++ и библиотека на C
Отправлено: gogi от Октябрь 13, 2010, 15:51
Выкладывай самый маленький компилябельный пример
с libcue? у меня так ничего и не получилось скомпилировать с его участием.

Попробуй helloworld слинковать с этой либой и повызывать из неё какие-либо функции.
helloworld в данной случае если не понял - простой маленький файл .c(.cpp) с функцией main.


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 13, 2010, 16:10
Код:
#project.pro
SOURCES += main.cpp
LIBS += -lcue
INCLUDEPATH += /usr/include/libcue-1.3/libcue
Код:
//main.cpp
extern "C" {
#include <cdtext.h>
}

int main(int argc, char *argv[])
{
Cdtext *cueSheet = cdtext_init();
return 0;
}
компилируется без ошибок и выполняется


Название: Re: приложение на C++ и библиотека на C
Отправлено: gogi от Октябрь 13, 2010, 16:16
Ну а теперь попробуй постепенно из helloworlda сделать свою программу, копируя куски кода и периодически проверяя компиляцию


Название: Re: приложение на C++ и библиотека на C
Отправлено: Alex Custov от Октябрь 13, 2010, 19:45
Выкладывай самый маленький компилябельный пример
с libcue? у меня так ничего и не получилось скомпилировать с его участием.

Хотя бы самый маленький пример, который не компилируется. Там у тебя я вижу ещё CLucene используется.


Название: Re: приложение на C++ и библиотека на C
Отправлено: Авварон от Октябрь 13, 2010, 21:15
Порядок хедеров попробуй поменять.


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 15, 2010, 07:51
Порядок хедеров попробуй поменять.
не помогло


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 15, 2010, 08:09
Хотя бы самый маленький пример, который не компилируется. Там у тебя я вижу ещё CLucene используется.
Код:
# project.pro
SOURCES += main.cpp
LIBS += -lcue \
-lclucene
INCLUDEPATH += /usr/include/libcue-1.3/libcue

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

int main(int argc, char *argv[]) {
Cdtext *cueSheet = cdtext_init();
return 0;
}

это уже не компилируется


Название: Re: приложение на C++ и библиотека на C
Отправлено: gogi от Октябрь 15, 2010, 10:24
это уже не компилируется
INCLUDEPATH для CLucene.h добавил?


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 15, 2010, 10:30
INCLUDEPATH для CLucene.h добавил?
это ни к чему, так как CLucene.h находится в /usr/include


Название: Re: приложение на C++ и библиотека на C
Отправлено: Alex Custov от Октябрь 15, 2010, 15:16
это уже не компилируется

покажи полный лог


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 15, 2010, 15:51
покажи полный лог
Код:
Running build steps for project project...
Configuration unchanged, skipping QMake step.
Starting: /usr/bin/make -w
make: Entering directory `/home/human-being/Desktop/project/project'
g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I/usr/include/libcue-1.3/libcue -I. -o main.o main.cpp
In file included from /usr/include/sys/stat.h:107,
from /usr/include/CLucene/StdHeader.h:76,
from /usr/include/CLucene.h:11,
from main.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
main.cpp:7: warning: unused parameter ‘argc’
main.cpp:7: warning: unused parameter ‘argv’
make: *** [main.o] Error 1
make: Leaving directory `/home/human-being/Desktop/project/project'
Exited with code 2.
Error while building project project
When executing build step 'Make'


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 15, 2010, 16:13
только что попробовал заменить CLucene на TagLib, и такой тандем прокатил. видимо, всё-таки проблема связана не с libcue, а с CLucene, причём она возникает, только если пытаешься использовать библиотеку на C.


Название: Re: приложение на C++ и библиотека на C
Отправлено: Alex Custov от Октябрь 15, 2010, 18:45
только что попробовал заменить CLucene на TagLib, и такой тандем прокатил. видимо, всё-таки проблема связана не с libcue, а с CLucene, причём она возникает, только если пытаешься использовать библиотеку на C.

CLucene каким-то образом запрещает объявление структуры timespec в time.h, поэтому поля st_atim и другие имеют неопределённый тип. Я не могу воспроизвести, у меня более новые версии билиотек и всё собирается. Что если перед включением CLucene.h добавить

Код
C++ (Qt)
#define __USE_MISC
#include <ctime>
 


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 16, 2010, 07:14
Что если перед включением CLucene.h добавить

Код
C++ (Qt)
#define __USE_MISC
#include <ctime>
 
Код:
Running build steps for project project...
Configuration unchanged, skipping QMake step.
Starting: /usr/bin/make -w
make: Entering directory `/home/human-being/Desktop/project/project'
/usr/bin/qmake-qt4 -spec /usr/share/qt4/mkspecs/linux-g++ -unix CONFIG+=debug -o Makefile project.pro
make: Leaving directory `/home/human-being/Desktop/project/project'
make: Entering directory `/home/human-being/Desktop/project/project'
g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I/usr/include/libcue-1.3/libcue -I. -o main.o main.cpp
main.cpp:5:1: warning: "__USE_MISC" redefined
In file included from /usr/include/stdio.h:28,
from /usr/include/libcue-1.3/libcue/cdtext.h:12,
from /usr/include/libcue-1.3/libcue/cd.h:12,
from main.cpp:3:
/usr/include/features.h:278:1: warning: this is the location of the previous definition
In file included from main.cpp:6:
/usr/include/c++/4.4/ctime:62: error: ‘::clock_t’ has not been declared
/usr/include/c++/4.4/ctime:63: error: ‘::time_t’ has not been declared
/usr/include/c++/4.4/ctime:64: error: ‘::tm’ has not been declared
/usr/include/c++/4.4/ctime:66: error: ‘::clock’ has not been declared
/usr/include/c++/4.4/ctime:67: error: ‘::difftime’ has not been declared
/usr/include/c++/4.4/ctime:68: error: ‘::mktime’ has not been declared
/usr/include/c++/4.4/ctime:69: error: ‘::time’ has not been declared
/usr/include/c++/4.4/ctime:70: error: ‘::asctime’ has not been declared
/usr/include/c++/4.4/ctime:71: error: ‘::ctime’ has not been declared
/usr/include/c++/4.4/ctime:72: error: ‘::gmtime’ has not been declared
/usr/include/c++/4.4/ctime:73: error: ‘::localtime’ has not been declared
/usr/include/c++/4.4/ctime:74: error: ‘::strftime’ has not been declared
In file included from /usr/include/sys/stat.h:107,
from /usr/include/CLucene/StdHeader.h:76,
from /usr/include/CLucene.h:11,
from main.cpp:7:
/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
main.cpp:9: warning: unused parameter ‘argc’
main.cpp:9: warning: unused parameter ‘argv’
make: *** [main.o] Error 1
make: Leaving directory `/home/human-being/Desktop/project/project'
Exited with code 2.
Error while building project project
When executing build step 'Make'
это о чём-нибудь говорит?


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Октябрь 27, 2010, 17:59
попробовал на openSUSE 11.3 с clucene-0.9.21 и libcue-1.4. результат тот же.


Название: Re: приложение на C++ и библиотека на C
Отправлено: theorist от Ноябрь 02, 2010, 09:16
ответ здесь: http://stackoverflow.com/questions/3952699/ (http://stackoverflow.com/questions/3952699/)


Название: Re: приложение на C++ и библиотека на C (решено)
Отправлено: Alex Custov от Ноябрь 03, 2010, 17:52
я же говорил используй pkg-config, такой бы проблемы не возникло.