Форум программистов, компьютерный форум, киберфорум
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
1

Какой-то баг в GCC

17.08.2009, 10:20. Просмотров 2682. Ответов 21
Метки нет (Все метки)


Переставил FreeBSD с 6 на 7.
После этого перестала линковаться программа - компилируется без ошибок, но линковщик пишет
/var/tmp//ccsaOcQc.o(.gnu.linkonce.t._ZN7CCookie7SetListERKSsS1_+0x66) : In function `CCookie::SetList(std::string const&, std::string const&)':
: undefined reference to `CCookie::week4'
/var/tmp//ccsaOcQc.o(.gnu.linkonce.t._ZN7CCookie7SetListERKSsS1_+0x70) : In function `CCookie::SetList(std::string const&, std::string const&)':
: undefined reference to `CCookie::whileOpen'
/var/tmp//ccsaOcQc.o(.gnu.linkonce.t._ZN7CCookie5WriteEv+0x2a8): In function `CCookie::Write()':
: undefined reference to `CCookie::year4'
/var/tmp//ccsaOcQc.o(.gnu.linkonce.t._ZN7CCookie5WriteEv+0x2b2): In function `CCookie::Write()':
: undefined reference to `CCookie::week4'
В одном классе было три константы
C++
1
2
3
    static const long week4=3600*24*7*4;
    static const long year4=week4*52;
    static const long whileOpen=-1;
Пришлось вынести их в глобальные.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.08.2009, 10:20
Ответы с готовыми решениями:

GCC Сборка 32 разрядной версии GCC 64 разрядным GCC
Доброго времени суток. Возникла необходимость под 32х разрядный Linux, собрать 32 разрядный GCC. Но...

Какой GCC+MinGW нужно устанавливать?
У меня Убунта 14.04 64 разрядная, в списке дистрибутив компиляторов много, какой из них выбрать и...

Какой-то БАГ с цветовой палитрой !?!?!
В дизайнере когда выбираю цвета для оформления любого объекта у меня палитра цветовая (имею ввиду...

Странный очень баг, какой-то нелогичный...
Всех девченок лотусистов и не очень поздравляю с наступающим 8-м марта! началом новой весны! желаю...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
21
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
17.08.2009, 10:29 2
здорово. люблю читать мысли вслух.
0
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
17.08.2009, 10:53  [ТС] 3
Цитата Сообщение от zim22 Посмотреть сообщение
здорово. люблю читать мысли вслух.
не вслух, а в пост

Ну ладно, поставлю вопрос
- Где баг? В мозгах, иль GCC?

"Раньше" компилировалось
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
17.08.2009, 10:57 4
Цитата Сообщение от skvor Посмотреть сообщение
Ну ладно, поставлю вопрос
большое спасибо

Цитата Сообщение от skvor Посмотреть сообщение
- Где баг? В мозгах, иль GCC?
в мозгах. даю гарантию 99.999999999%
0
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
17.08.2009, 11:22  [ТС] 5
Цитата Сообщение от zim22 Посмотреть сообщение
в мозгах. даю гарантию 99.999999999%
Некоторые разработчики OpenBSD, например Тэо де Раадт и Отто Мёрбек (Otto Moerbeek), критикуют GCC, называя его «громоздким, глючным, медленным, и генерирующим плохой код.»

Теперь, надо уточнить - в какой (чьей) извилине
0
2808 / 1399 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 11:56 6
Цитата Сообщение от skvor Посмотреть сообщение
Теперь, надо уточнить - в какой (чьей) извилине
ну значит в ваших.
skvor, ты же сам сказал
Цитата Сообщение от skvor Посмотреть сообщение
После этого перестала линковаться программа
а раз раньше линковалась, то проблема не в GCC.
0
Почетный модератор
7356 / 2619 / 275
Регистрация: 29.07.2006
Сообщений: 13,675
17.08.2009, 12:02 7
Че-то недокомпилял. Где-то код думает, что искать бывших мемебров нужно в классе. Или неправильно вынес из класса его элементы.
0
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
17.08.2009, 12:26  [ТС] 8
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
а раз раньше линковалась, то проблема не в GCC.
Проблема возникла после смены версии FreeBSD.

Ладно, тему можно слегка прикрыть, пойду курить GCC.
Но если кто-то сталкивался с подобным - пишите.

Всем спасибо.

Добавлено через 1 минуту 30 секунд
Цитата Сообщение от Vourhey Посмотреть сообщение
Или неправильно вынес из класса его элементы.
Тогда бы ругнулся компилятор.
0
2808 / 1399 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 12:30 9
Цитата Сообщение от skvor Посмотреть сообщение
Тогда бы ругнулся компилятор.
а он что не "ругнуется"? По-моему он явно говорит: не определена ссылка undefined reference to CCookie::week4 в функции CCookie::SetList(std::string const&, std::string const&)
0
Почетный модератор
7356 / 2619 / 275
Регистрация: 29.07.2006
Сообщений: 13,675
17.08.2009, 12:35 10
Тогда бы ругнулся компилятор.
Это от ошибки зависит.

Добавлено через 35 секунд
Проблема возникла после смены версии FreeBSD.
ты же выше написал, что ты еще вынес из класса константы.
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
17.08.2009, 12:37 11
Скажи, какая версия gcc была на старой и на новой системе? Наверняка продвинулись немало. С GCC ситуация следующая: "старые" версии gcc (ещё чуть ли не с версии 2.95) очень фривольно работали со стандартом Си++, при этом куча ситуация, являющихся с точки зрения стандарта некорркектными, считались правильными и для них генерился код. А начиная с версии 3.0 и по сей день они от этих косяков избавляются и компилятор становится всё более и более строгим (т.е. разрешает всё меньше и меньше запрещённых ситуаций)

В твоём случаее скорее всего получилось так, что код у тебя был некорректным (с точки зрения стандарта), но "старый" gcc его ел, а "новый" - уже нет. Поэтому не имея исходников врядли кто-то тут тебе поможет. Либо на новую систему ставь ту же версию gcc, что была раньше
0
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
17.08.2009, 12:46  [ТС] 12
Цитата Сообщение от Vourhey Посмотреть сообщение
ты же выше написал, что ты еще вынес из класса константы.
Таки прально, если константы в классе - компилятор не ругается, но линковщик их не видит, я потанцевал с бубном - вынес эти три константы в глобальные - линковщик всё нормально собирает.
А до смены версии BSD, всё нормально было - никто не был против статических констант в классе.

Сейчас состряпал такой пример, с теми же константами (строки 34-36), он нормально работает - и компилируется и линкуется
C++
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
42
43
44
#include <iostream>
#include <string>
#include <fstream>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <fcntl.h>
#include <openssl/md5.h>
 
long n;
class CCookie
{ private:
    std::string     LoginMark() { return "l"; }
    void Set(const std::string &Name,const std::string &Value,const long MaxAge=whileOpen)
    { if (0);
      else {}
    }
  public:
    static const long week4=3600*24*7*4;
    static const long year4=week4*52;
    static const long whileOpen=-1;
    std::string Write()
    { long period;
      if (n>week4)
      { Set(LoginMark(),"456",week4);
        for (int i=0; i<2 ; ++i)
           if (0) Set("time","789",1?year4:week4);
      }
      return "a=999";
    }
} Cookie;
 
int main(int argc, char *argv[], char *env[])
{ n=123;
  std::cout<<Cookie.Write();
  return 0;
}
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
17.08.2009, 12:49 13
Лучше напиши пример, который не линкуется. Правильно поставленный вопрос - это уже половина ответа
0
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
17.08.2009, 13:01  [ТС] 14
Цитата Сообщение от Evg Посмотреть сообщение
Лучше напиши пример, который не линкуется.
Увы, но нелинкующийся пример - 350К текста.
Боюсь, если выложу, меня все сожрут

Какая версия GCC не знаю, буду разбираться, но думаю дело не в стандартах - тоже но порезаное работает, компилятор не ругается. А гемор только с этими константами и только в конкретной программе. Наверное, надо чёнить обновить.

Дцать лет назад имел аналогичный баг в TP7.0 - программа неправильно работала со строкой (ошибалась адресом), "вылечил" введением лишней переменной.
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
17.08.2009, 13:09 15
Учись сокращать пример. Потому как строить догадки в возхдухе - неблагородное занятие. У меня есть одна мысль, но если она не прокатит - значит разбираться рпидётся тебе самому

У тебя в *.h файле наверняка написано:

C++
1
2
3
4
5
6
7
class CCookie
{
...
  public:
    static const long week4=3600*24*7*4;
    static const long year4=week4*52;
    static const long whileOpen=-1;
Попробуй вместо этого:

C++
1
2
3
4
5
6
7
8
// Это в файле *.h
class CCookie
{
...
  public:
    static const long week4;
    static const long year4;
    static const long whileOpen;
C++
1
2
3
4
// А это в файле *.cpp, где реализованы методы класса CCokie
const long CCookie::week4=3600*24*7*4;
const long CCookie::year4=week4*52;
const long CCookie::whileOpen=-1;
0
2808 / 1399 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 13:11 16
Цитата Сообщение от skvor Посмотреть сообщение
Увы, но нелинкующийся пример - 350К текста.
Боюсь, если выложу, меня все сожрут
в архив и Attach к форуму.
0
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
17.08.2009, 13:24  [ТС] 17
Evg, спасибо, помогло!
Правда, я заголовочные файлы не пишу, но вынос "реализации" за пределы класса, действительно, оказался хоть и бубном, но эффективным.
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
17.08.2009, 13:27 18
Это не бубен, это по ГОСТу так делается в общем случае. Однако для целых типов и указателей стандарт допускает такую инициализацию держать внутри описания класса
1
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
17.08.2009, 13:32  [ТС] 19
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
в архив и Attach к форуму.
Вi менэ пiдстрiкаете к издевательству над другими?
Кто будет читать это всё?

В общем, проблему решил на 97%, всем спасибо!

Добавлено через 3 минуты 40 секунд
Цитата Сообщение от Evg Посмотреть сообщение
по ГОСТу
Я думаю, это не ГОСТ, а, скорее, вопрос культуры.
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
17.08.2009, 13:33 20
Это именно стандарт. Только что-то меня переклинило, естественно "стандарт Си++" а не "ГОСТ".
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2009, 13:33

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Вирус, либо какой-то странный баг
Здравствуйте. Возникла у меня очень странная ситуация. После случайного времени (иногда неделя,...

Выпадающее меню не получается, какой-то баг SOS
Помогите пожалуйста, пытаюсь писать меню для сайта. Все получилось, а сделать выпадающий список -...

Как под Windows 10 установить GCC 8.1 и подцепить его к какой-нибудь вменяемой IDE?
Есть ли какая-нибудь возможность безболезненно подружить этих двух зверей? Имеется в виду наличие...

Как вообще такое может быть, это просто супер баг какой-то
Есть программа, результат выполнения отладочных строк procedure spervogo; var counter1,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.