170 похожих чатов

Здраствуйте, помогите прийти к решению проблемы. Есть класс class Window { public:

static GLFWwindow* window;
};
статическая переменная которого определена в файле его реализации GLFWwindow* Window::window;
но есть необходимость использовать ее в другого классе
class Events {
public:
static int initialize();
};
а именно в функции
int Events::initialize() {
GLFWwindow* window = Window::window;
return 0;
}
как это можно сделать?

37 ответов

13 просмотров

Ты уже это сделал

Артем- Автор вопроса
Kirill Bolshakov
Ты уже это сделал

Но компилятор так не считает

Артем- Автор вопроса
Артем
Но компилятор так не считает

выдает Ошибка LNK2001 неразрешенный внешний символ "public: static class GLFWwindow * Window::window"

Артем
выдает Ошибка LNK2001 неразрешенный внешний симв...

cpp файл с определением статической переменной не собираешь

Нет никаких препятствий чтобы у тебя это не получилось.

Ты же написал : статическая переменная которого определена в файле его реализации GLFWwindow* Window::window; Либо ты обманываешь и не определена, либо не может быть такой ошибки. Шли полный код...

Артем- Автор вопроса
Ilya Zviagin
Ты же написал : статическая переменная которого о...

код в нескольких файлах (7), как грузить?

Артем
https://pastebin.com/S9RUGQjs

Да все ок, должно работать

Артем- Автор вопроса
Ilya Zviagin
Да все ок, должно работать

не подскажите как в студие посмотреть порядок линковки? есть догадки что там проблема

Артем- Автор вопроса
Ilya Zviagin
Порядок линковки - это что?

в каком порядке файлы принимаются компилятором

Артем
не подскажите как в студие посмотреть порядок линк...

Почитай что такое раздельная компиляция. Это концепция, которая позволяет компилировать файлы независимо. После компиляции определенного файла часть имен (символов) остается неразрешенными (unresolved). Задача линковщика разрешить все unresolved символы. Сам понимаешь, здесь порядок абсолютно неважен.

Anatoly Shirokov
Почитай что такое раздельная компиляция. Это конце...

ЕМНИП важен же. Насколько я помню, линковщик в одном проходе и собирает по объектникам неразрешённые символы, и разрешает эти символы. То есть если к моменту появления неразрешённого символа в другом объектнике нужный объектник ещё не обошли, то произойдёт ошибка линковки.

Anatoly Shirokov
Почитай что такое раздельная компиляция. Это конце...

В 10-й студии были проблемы, которые реально решались изменением порядка линковки. в принципе, это были костыли...

Anatoly Shirokov
Почитай что такое раздельная компиляция. Это конце...

Порядок списка либ на входе линковщику важен, он как то их по порядку смотрит и назад не возвращается. По крайней мере линуксовый такой баг дизайна имеет

Kirill Bolshakov
Порядок списка либ на входе линковщику важен, он к...

Это разве баг? Иначе линкер бы пол века работал

Егор (Дима)
Это разве баг? Иначе линкер бы пол века работал

Почему пол века? Второй проход для разрешения оставшихся неразрешенных после первого, но в обратном порядке

Kirill Bolshakov
Почему пол века? Второй проход для разрешения оста...

т.е ему нужно будет для второго прохода загрузить в память все либы с которыми я линкуюсь и искать там функции? А память ему кто даст? У меня и обычный линкер комп крашит

Егор (Дима)
та всё равно дорого как-то

Можно сделать спец. флаг --not_zashkvar_mode который эту фичу включает

Егор (Дима)
так есть же уже что-то такое

-Wl,-\( -liba -libb -libc) если кто-то название знает то подскажите, я не могу это нагуглить нигде кроме лекции на ютубе

Егор (Дима)
-Wl,-\( -liba -libb -libc) если кто-то название зн...

Многопроходность линкера? https://sourceware.org/binutils/docs-2.16/ld/Options.html -( archives -) --start-group archives --end-group The archives should be a list of archive files. They may be either explicit file names, or -l options. The specified archives are searched repeatedly until no new undefined references are created. Normally, an archive is searched only once in the order that it is specified on the command line. If a symbol in that archive is needed to resolve an undefined symbol referred to by an object in an archive that appears later on the command line, the linker would not be able to resolve that reference. By grouping the archives, they all be searched repeatedly until all possible references are resolved. Using this option has a significant performance cost. It is best to use it only when there are unavoidable circular references between two or more archives.

🐈
В 10-й студии были проблемы, которые реально решал...

Не припомню проблем в студии и msvc. Gcc грешил, да.

Viktor Shamparov
ЕМНИП важен же. Насколько я помню, линковщик в одн...

Что за ересь? Задача линкера, чтобы все неразрешенные символы разрешились. Где здесь о порядке?

Anatoly Shirokov
Что за ересь? Задача линкера, чтобы все неразрешен...

Ну там в линуксе действительно есть такая проблема, но это только один Линкер на свете (хотя важный) Там не совсем это так тупорыло важно как Виктор написал. Но там реально иногда важен порядок указания и обработки библиотек. Но это скорее исключение

Ilya Zviagin
Ну там в линуксе действительно есть такая проблема...

Я знаю об особенностях gcc, но делать на основании этого "выводы" странно.

Anatoly Shirokov
Не припомню проблем в студии и msvc. Gcc грешил, д...

Насколько я помню, там при статической линковке MFC нужно было добавить некоторые lib-ки в список "исключить из сборки" и часть из них-же в список библиотек, с которыми надо линковаться. Да, звучит как бред, но без этого было не собрать прогу, которая не требовала бы установку дополнительных dll-ок на компе, где не установлена студия.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта