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 ответов

7 просмотров

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

Артем- Автор вопроса
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-ок на компе, где не установлена студия.

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

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

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
Есть предложения, как подобное можно упростить?
Hemul GM
12
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
У меня вопросик назрел. Почему, создав класс без наследования и реализации деструктора Destroy, деструктор не вызывался при free. Потом указал наследование от tobject и overri...
Сергей Бычков
9
@y0zhig @shizzard А можно я опишу цель и может вообще ерланг мне не подходит. На текущий момент как я понимаю у ерланга есть легковесные потоки и задача выполняется в каком т...
Дмитрий Спиридонов
5
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
just use free version ?? pycharm has a free version
Fan / Ac
9
Карта сайта