Понадобилось собрать QT5 -проект на MacOS. Под Windows собрался успешно. Там были строки вида:
#pragma once
....
constexpr char* Value1 = "sdfsdfasf";
— в h-файле с в глобальном пространстве имен. constexpr компилятор отверг (чего-то там с версией C++ связано). Ну ок, допустим компилятор не понимает constexpr.
Второе. Заменил на const, типа так:
#pragma once
....
const char* Value1 = "sdfsdfasf";
Потратил еще кучу времени на сборку — уже на этапе линковки возникла ошибка — пишет что переменная Value1 объявлена дважды или что-то такое. Один файл мой, другой какой-то комбинированный. При этом на Windows все успешно собралось.
Здравствуйте, Shmj, Вы писали:
S>Что это могло быть? Какие гипотезы?
Ну у тебя твой ашник в два (или более) разных сишника включается. В каждом из них создается глобальный символ Value1. А когда линкер пытается свести все это вместе, то он видит, что один и тот же символ объявлен дважды в разных местах, и ругается.
Слово static делает символ локальным, проблема разрешается, но строка заведется отдельная в каждом сишнике (а в исполняемом файле будет присутствовать много копий одной строки). Почему вендовый линкер не ругается? Ну видимо, сознательно ведет себя неправильно, чтобы таких бедолаг, как ты, не расстраивать.
— читай про связывание. Вопросы тебе на самостоятельную проработку:
— Что такое связывание?
— Какой тип связывания по умолчанию имеют переменные?
— Какой тип связывания по умолчанию имеют константы?
— Какой тип имеет указатель Value1, который ты объявил?
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Pzz, Вы писали:
Pzz>Ну у тебя твой ашник в два (или более) разных сишника включается. В каждом из них создается глобальный символ Value1. А когда линкер пытается свести все это вместе, то он видит, что один и тот же символ объявлен дважды в разных местах, и ругается.
А как же правильно сделать? Что если эти константы нужны в 2-х разных cpp-файлах?
Здравствуйте, Pzz, Вы писали:
Pzz>Слово static делает символ локальным, проблема разрешается, но строка заведется отдельная в каждом сишнике (а в исполняемом файле будет присутствовать много копий одной строки). Почему вендовый линкер не ругается? Ну видимо, сознательно ведет себя неправильно, чтобы таких бедолаг, как ты, не расстраивать.
Чобы ему ругаться?
static по идее вообще из объектника торчать не должен никак
Здравствуйте, пффф, Вы писали:
Pzz>>Слово static делает символ локальным, проблема разрешается, но строка заведется отдельная в каждом сишнике (а в исполняемом файле будет присутствовать много копий одной строки). Почему вендовый линкер не ругается? Ну видимо, сознательно ведет себя неправильно, чтобы таких бедолаг, как ты, не расстраивать.
П>Чобы ему ругаться?
Да нам говорят, что вендовый линкер и без статика не ругается на дублирующийся символ. Я не проверял, мне эта венда 100 лет как без разницы со всеми ее прибамбасами.
Здравствуйте, Pzz, Вы писали:
Pzz>>>Слово static делает символ локальным, проблема разрешается, но строка заведется отдельная в каждом сишнике (а в исполняемом файле будет присутствовать много копий одной строки). Почему вендовый линкер не ругается? Ну видимо, сознательно ведет себя неправильно, чтобы таких бедолаг, как ты, не расстраивать.
П>>Чобы ему ругаться?
Pzz>Да нам говорят, что вендовый линкер и без статика не ругается на дублирующийся символ. Я не проверял, мне эта венда 100 лет как без разницы со всеми ее прибамбасами.
Без static — ругается. Но может и просто варнинг выдать, если одно и то же. Со static — нет. Ты тоже про связывание только краем уха слышал?
Здравствуйте, пффф, Вы писали:
Pzz>>Да нам говорят, что вендовый линкер и без статика не ругается на дублирующийся символ. Я не проверял, мне эта венда 100 лет как без разницы со всеми ее прибамбасами.
П>Без static — ругается. Но может и просто варнинг выдать, если одно и то же. Со static — нет. Ты тоже про связывание только краем уха слышал?
Нет. Но про особенности вендового линкера только краем уха слышал.
Здравствуйте, Shmj, Вы писали:
S>Потом добавил: S>
S>static const char* Value1 = "sdfsdfasf";
S>
S>- и о чудо — оно собралось. S>Что это могло быть? Какие гипотезы?
Короче, напиши вот так и будет тебе счастье:
const char* const Value1 = "sdfsdfasf";
Обрати внимание на два модификатора const. Таким образом ты объявляешь константный указатель, на константые данные. То есть, это константа. А константы по умолчанию имеют внутреннее связывание. То есть 'static' вместо тебя незримо подставит сам компилятор.
P.S. Не благодари.
--
Справедливость выше закона. А человечность выше справедливости.
S>Такой вопрос-загадка.
Нифига это не загадка S>Понадобилось собрать QT5 -проект на MacOS. Под Windows собрался успешно.
У меня сразу возникают вопросы:
1. Компиляторы были одинаковые в винде и макоси?
2. Версии стандарта в компиляторе установлены одинаковые?
3. Qt были одной и той же версии ?
И напоследок: первая строка кода и последняя (которая собралась) — это две БОЛЬШИЕ разницы, как говорили в Одессе...
Pzz объяснил уже.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
Pzz>>Я даже знаю слово COMDAT. Но краем уха, да. LVV>Я его тоже только в настройках Студии видел... LVV>И что оно означает — понятия не имею...
У тебя когда C++, волей-неволей получаются дублирующиеся символы. Ну, например, inline методы в хидере, которые компилятор не осилил проинлайнить, и скомпилировал, как обычную функцию (имеет право, inline — это вежливая просьба, а не приказ).
И с ними надо что-то делать, на уровне линкера. Это — часть этого механизма.
Pzz>>>Я даже знаю слово COMDAT. Но краем уха, да. LVV>>Я его тоже только в настройках Студии видел... LVV>>И что оно означает — понятия не имею... Pzz>У тебя когда C++, волей-неволей получаются дублирующиеся символы. Ну, например, inline методы в хидере, которые компилятор не осилил проинлайнить, и скомпилировал, как обычную функцию (имеет право, inline — это вежливая просьба, а не приказ). Pzz>И с ними надо что-то делать, на уровне линкера. Это — часть этого механизма.
Спасибо.
Саму схему линкования я студням рассказывал, но до такой конкретики не опускался.
На эту тему есть неплохая книжки (и по-моему единственная) Линкеры и загрузчики (не переведена у нас — а зря).
Много лет назад мне попадалась.
Мож сейчас еще что появилось — давно не интересовался.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!