2016-10-09 2 views
0

Я пишу приложение в D, которое взаимодействует с OpenGL и несколькими другими родными библиотеками (используя библиотеки Derelict). Однако эта ошибка, похоже, совсем не связана с этим.Ошибка компоновщика: неопределенная ссылка на `internal '

Всякий раз, когда я делаю «даб сборки» компиляция прошла успешно, но л.д. терпит неудачу с этим сообщением:

Linking... 
../git/mango-engine/bin/libmango-engine.a(gl_model_503_284.o):(.data._D12mango_engine8graphics6opengl8gl_model7GLModel6__initZ+0x10):  undefined reference to `internal' 
../git/mango-engine/bin/libmango-engine.a(shader_51b_52f.o): (.data._D12mango_engine8graphics6shader13ShaderProgram6__initZ+0x18):  undefined reference to `internal' 
collect2: error: ld returned 1 exit status 

Я понятия не имею, что это значит, и никогда не видел его раньше. Кроме того, странно эта ошибка возникает только при импорте определенных файлов: gl_model.d и shader.d из другого проекта DUB. Если они не импортированы, компоновщик удался.

Я не уверен, какую информацию предоставить, так что я буду просто связать весь исходный код here.

EDIT: Эта ошибка возникает только при компиляции для x86_64. x86 отлично работает.

+0

Существует функция или переменная, которая может быть помечена как «extern (C) void internal()» или что-то вроде объявленного, но не определенного. Этот модуль 'mango_engine.graphics', это ваш код или из библиотеки? –

+0

@ AdamD.Ruppe У меня есть только одно выражение extern во всем проекте, и у него есть реализация. Он также не назван нигде рядом с «внутренним» – jython234

ответ

0

я отслеживал его до двух строк в двух файлах (и тех же):

private SyncLock lock = new SyncLock(); 

Где SyncLock является пустым классом, который я использую для «синхронных» блоков (не уверен, это правильный способ сделать это). По какой-то причине, если я переношу инициализацию на конструктор, он отлично работает (без ошибок).

+2

Инициализация члена класса полностью отличается от конструктора ... член класса * статически * инициализирован, что означает, что 'new SyncLoc()' выполняется во время компиляции, и указатель на один объект в данных является частью инициализатора класса ... что означает, что ВСЕ экземпляры класса будут совместно использовать один, статический экземпляр SyncLock. Конструктор - это способ сделать это, если каждый экземпляр должен быть отдельным (почти всегда то, что вы хотите). Я до сих пор не понимаю, почему там есть символ 'internal', но' private Object x = new Object(); 'почти всегда является ошибкой новичка. –

+0

И вообще вы можете делать все, что хотите, без использования блокировки, если вы пишете свою программу надлежащим образом. Свободное программирование - это путь, потому что замки - это дорогостоящая работа, для чего вы, скорее всего, можете обойтись. – Bauss

Смежные вопросы