Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt + C библиотека = ошибка локали / 9 сообщений из 9, страница 1 из 1
22.01.2014, 12:55
    #38534180
PitBull
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt + C библиотека = ошибка локали
Всем доброго времени суток.

Пытаю добавить iperf3 в свой Qt проект. Qt 4.8.5. Система OpenSuse 13.1.

Инклуды как и положено лежат в extern "C". Причём, если либу прикрепить к обычному С++ проекту, всё в порядке, а вот если к Qt проекту, вылетает куча ошибок локалью.

Ошибки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../lperftest -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include -I../lperf/include -I. -I../lperftest -I. -o main.o ../lperftest/main.cpp
In file included from /usr/include/c++/4.8/x86_64-suse-linux/bits/c++locale.h:41:0,
from /usr/include/c++/4.8/bits/localefwd.h:40,
from /usr/include/c++/4.8/string:43,
from /usr/include/QtCore/qstring.h:54,
from /usr/include/QtCore/qobject.h:48,
from /usr/include/QtCore/QObject:1,
from ../lperftest/main.cpp:9:
/usr/include/c++/4.8/clocale:53:11: error: '::lconv' has not been declared
using ::lconv;
^
/usr/include/c++/4.8/clocale:54:11: error: '::setlocale' has not been declared
using ::setlocale;
^
/usr/include/c++/4.8/clocale:55:11: error: '::localeconv' has not been declared
using ::localeconv;
^
In file included from /usr/include/c++/4.8/bits/localefwd.h:40:0,
from /usr/include/c++/4.8/string:43,
from /usr/include/QtCore/qstring.h:54,
from /usr/include/QtCore/qobject.h:48,
from /usr/include/QtCore/QObject:1,
from ../lperftest/main.cpp:9:
/usr/include/c++/4.8/x86_64-suse-linux/bits/c++locale.h:52:23: error: 'uselocale' was not declared in this scope
extern "C" __typeof(uselocale) __uselocale;
^
/usr/include/c++/4.8/x86_64-suse-linux/bits/c++locale.h:52:45: error: invalid type in declaration before ';' token
extern "C" __typeof(uselocale) __uselocale;
^
/usr/include/c++/4.8/x86_64-suse-linux/bits/c++locale.h: In function 'int std::__convert_from_v(__locale_struct* const&, char*, int, const char*, ...)':
/usr/include/c++/4.8/x86_64-suse-linux/bits/c++locale.h:75:53: error: '__gnu_cxx::__uselocale' cannot be used as a function
__c_locale __old = __gnu_cxx::__uselocale(__cloc);
^
/usr/include/c++/4.8/x86_64-suse-linux/bits/c++locale.h:100:33: error: '__gnu_cxx::__uselocale' cannot be used as a function
__gnu_cxx::__uselocale(__old);
^
../lperftest/main.cpp: At global scope:
../lperftest/main.cpp:11:5: warning: unused parameter 'argc' [-Wunused-parameter]
int main(int argc, char *argv[])
^
../lperftest/main.cpp:11:5: warning: unused parameter 'argv' [-Wunused-parameter]
make: *** [main.o] Error 1


По мне, видать конфликтуют инклуды, понять бы какие. Заранее всем спасибо.
...
Рейтинг: 0 / 0
22.01.2014, 13:36
    #38534257
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt + C библиотека = ошибка локали
PitBull,

Может быть, покажешь всё же код ?
...
Рейтинг: 0 / 0
22.01.2014, 13:44
    #38534270
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt + C библиотека = ошибка локали
пока идея такая, что ты что-то сломал в системных инклюдах. Идея бредовая, но пока другой нет.

Ты включаешь в ../lperftest/main.cpp:9:
файл заголовок QObject

и он жалуется в

/usr/include/c++/4.8/clocale:53:11:

в системном заголовке, что не определен символ

lconv

error: '::lconv' has not been declared

, тоже системный.


Вывод: либо ты что-то в системных заголовках сломал, либо ты какими-то дефайнами CRT законфигурил так, что твоя программа не может быть скомпилирована.

Т.е. идея 2 -- попробовать убрать -D_REENTRANT
...
Рейтинг: 0 / 0
22.01.2014, 14:20
    #38534331
PitBull
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt + C библиотека = ошибка локали
Система только что поставлены, кроме этого проекта проблем нигде нет.

Исходники:
в про файле подключение
Код: xml
1.
2.
LIBS += -L$$PWD/../bin/ -llperf
INCLUDEPATH += $$PWD/../lperf/include



исходники кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#include <stddef.h>
#include <stdint.h>
#include <sys/select.h>

extern "C" {
    #include <iperf_api.h>
}

#include <QtCore/QObject>

int main(int argc, char *argv[])
{
    struct iperf_test *test;
    test = iperf_new_test();

    return 0;
}



При наличии инклуда QtCore/QObject вылетает ошибка, убираем инклуд, всё работает.
...
Рейтинг: 0 / 0
22.01.2014, 14:43
    #38534378
PitBull
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt + C библиотека = ошибка локали
MasterZivВывод: либо ты что-то в системных заголовках сломал, либо ты какими-то дефайнами CRT законфигурил так, что твоя программа не может быть скомпилирована.

Т.е. идея 2 -- попробовать убрать -D_REENTRANT

Спасибо, буду копать в эту сторону.
...
Рейтинг: 0 / 0
22.01.2014, 16:27
    #38534590
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt + C библиотека = ошибка локали
Вот это:


Код: plaintext
1.
2.
3.
extern "C" {
    #include <iperf_api.h>
}




ты ЗРЯ делаешь.

Это должно делаться ВНУТРИ этого заголовка. Это ЕГО ответственность, а не твоя.

Это тоже может влиять на работоспособность твоего проекта.

(т.е. попробуй убрать extern "C" ).
...
Рейтинг: 0 / 0
22.01.2014, 16:47
    #38534629
PitBull
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt + C библиотека = ошибка локали
MasterZivВот это:


Код: plaintext
1.
2.
3.
extern "C" {
    #include <iperf_api.h>
}




ты ЗРЯ делаешь.

Это должно делаться ВНУТРИ этого заголовка. Это ЕГО ответственность, а не твоя.

Это тоже может влиять на работоспособность твоего проекта.

(т.е. попробуй убрать extern "C" ).

Пробовал убрать - не помогает. Пробовал перенести в iperf_api.h - не помогает.
...
Рейтинг: 0 / 0
22.01.2014, 18:07
    #38534738
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt + C библиотека = ошибка локали
PitBull,

Скорее всего iperf_api.h из себя включает <locale.h> который конфликтует с С++-ной реализацией <clocale>. Возможно у них перекрываются какие-то макросы.

В качестве идеи: Попробуйте в main.cpp переставить С++ заголовки перед С.

ЗЫ. Ничего плохого в таком коде нет
Код: plaintext
1.
2.
3.
extern "C" {
    #include <iperf_api.h>
}


И для чистых С библиотек это единственный способ использовать их в С++ (переписывание заголовка чужой библиотеки не допустимо).
...
Рейтинг: 0 / 0
28.01.2014, 19:39
    #38541176
PitBull
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt + C библиотека = ошибка локали
Проблему решил. Как оказалось, походу из-за одинаковых названий файлов и ифдефоф библиотечная locale конфликтовала с системной. Переименовал файл и всё полетело. Всем спасибо.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt + C библиотека = ошибка локали / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]