![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
MishaUA |
![]()
Сообщение
#1
|
Участник ![]() ![]() Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: ![]() ![]() ![]() |
есть такой код:
Здесь вроде все понятно. Если компилирую debug версию, то собирается без ошибок и отлично работает, а если release, то при сборке показывает такие ошибки: main.cpp:-1: ошибка: undefined reference to `operator>>(QDataStream&, s_StatusSettings&)' :-1: ошибка: ./release\main.o: bad reloc address 0x3f0 in section `.gcc_except_table' Пробовал делать полную очистку, не не помогло. Где я ошибся? Спасибо! |
|
|
ilyabvt |
![]()
Сообщение
#2
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: ![]() ![]() ![]() |
Линкер не видит определения операторов. Попробуйте включить определения в объявление класса, вы все равно методы inline делаете.
|
|
|
MishaUA |
![]()
Сообщение
#3
|
Участник ![]() ![]() Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: ![]() ![]() ![]() |
так работает)))))
|
|
|
MishaUA |
![]()
Сообщение
#4
|
Участник ![]() ![]() Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: ![]() ![]() ![]() |
а можно ли сделать так, чтобы линкер видел определения в *.сpp файле? Просто там хидер слишком большой получается
|
|
|
ilyabvt |
![]()
Сообщение
#5
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: ![]() ![]() ![]() |
Всего 6 строк добавляется. Уберите ключевое слово inline. Встраиваемые методы должны определятся в том же модуле что и класс.
|
|
|
Iron Bug |
![]()
Сообщение
#6
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
засовывание всего в заголовочники - это неправильный подход. в норме, в проект должен быть добавлен файл cpp. как это делается в Qt, я не знаю, но надо просто добавить файл status.c.
не очень понятно, почему файл имеет расширение .с, когда он явно CPP-шный. возможно, в настройках что-то не так. компияторы различают .c и .cpp и для компиляции файла .c как CPP надо дополнительно указывать настройки компилятору. Сообщение отредактировал Iron Bug - 22.8.2013, 20:09 |
|
|
ilyabvt |
![]()
Сообщение
#7
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: ![]() ![]() ![]() |
Цитата засовывание всего в заголовочники - это неправильный подход. в норме, в проект должен быть добавлен файл cpp. как это делается в Qt Полностью согласен. Но встраиваемые функции засовывают в заголовочники, в том числе и в Qt. |
|
|
MishaUA |
![]()
Сообщение
#8
|
Участник ![]() ![]() Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: ![]() ![]() ![]() |
заработало после того, как убрал inline))))
|
|
|
Iron Bug |
![]()
Сообщение
#9
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
на самом деле, в данном случае inline всё равно работать не будет, потому что есть возвращаемое значение и return. подробно ограничения на inline описаны, например, здесь. ограничений довольно много.
но если уж очень хочется оптимизировать вызовы, то можно использовать т.н. оптимизацию при линковке (link-time optimization). в более-менее свежих компиляторах она поддерживается. например, в msvc это опция /LTCG, в gcc это опция -flto. собственно, это "inline" на уровне линковщика. подробнее можно почитать тут. |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 27.2.2025, 10:38 |