Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
3 / 3 / 4
Регистрация: 29.10.2016
Сообщений: 18
1

Ошибка LNK2001: неразрешенный внешний символ

01.05.2018, 15:12. Показов 4505. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть решение (Solution) с названием Kate.

В него входят три проекта:
Core (ядро, компилируется в dll);
Renderer (визуализатор, использует Directx9 для рендера)
Kate (компилируется в запускаемый exe файл, подключает к себеCore и Renderer)

При компиляции выдаёт мне ошибку:
Main.obj : error LNK2001: unresolved external symbol "class Kate::Math::float2x2 Kate::Math::float2x2_identity" (?float2x2_identity@Math@Kate@@3Vfloat2x2@12@A)

Использую visual studio 2008.

Что мне не понятно, в ядре (Core) есть математическая часть (пространство имён Kate::Math), в ней есть класс float2x2 (матрица 2 на 2), и я создаю в cpp файле ("Float2x2.cpp") глобальную переменную float2x2 float2x2_identity и инициализирую ее. А в h файле ("Float2x2.h") я ее объявляю как extern float2x2 float2x2_identity.
Если это провернуть в запускаемом проекте (Kate), то всё работает как нужно и никакой ошибки нет. В чём проблема?

Файл "Float2x2.h"
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
#ifndef __FLOAT2X2_H__
#define __FLOAT2X2_H__
 
#include "float2.h"
 
namespace Kate {
namespace Math {
 
class KATE_API float2x2 {
public:
                        float2x2            ();
                        explicit float2x2   ( const float2 &x, const float2 &y );
                        explicit float2x2   ( const float xx, const float xy, const float yx, const float yy );
                        explicit float2x2   ( const float src[ 2 ][ 2 ] );
 
    ...
    ...
 
private:
    float2              mat[ 2 ];
};
 
extern float2x2 float2x2_zero;
extern float2x2 float2x2_identity;
 
KATE_INLINE float2x2::float2x2() {
}
 
...
...
 
}//namespace Math
}//namespace Kate
 
#endif //__FLOAT2X2_H__
Файл "Float2x2.cpp"
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 "Float2x2.h"
 
namespace Kate {
namespace Math {
 
float2x2 float2x2_zero( float2( 0.0f, 0.0f ), float2( 0.0f, 0.0f ) );
float2x2 float2x2_identity( float2( 1.0f, 0.0f ), float2( 0.0f, 1.0f ) );
 
//==============================
// float2x2::InverseSelf
//==============================
bool float2x2::InverseSelf() {
    double det, invDet, a;
 
    det = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0];
 
    if ( Abs( det ) < MAT_INV_EPS ) {
        return false;
    }
 
    invDet = 1.0f / det;
 
    a = mat[0][0];
    mat[0][0] = ( float )   (((double)mat[1][1]) * invDet);
    mat[0][1] = ( float ) - (((double)mat[0][1]) * invDet);
    mat[1][0] = ( float ) - (((double)mat[1][0]) * invDet);
    mat[1][1] = ( float )   (((double)a) * invDet);
 
    return true;
}
 
//==============================
// float2x2::ToString
//==============================
ktString float2x2::ToString( int precision ) const {
    ktString result;
 
    result.Print( "%.*f   %.*f\n%.*f   %.*f", precision, mat[0][0], precision, mat[0][1], precision, 
            mat[1][0], precision, mat[1][1] );\
    return result;
}
 
}//namespace Math
}//namespace Kate
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2018, 15:12
Ответы с готовыми решениями:

Ошибка: LNK2001: неразрешенный внешний символ
Есть простенький класс: class Ant { public: Ant(unsigned short pos, bool direct): ...

Ошибка линковки LNK2001. Неразрешенный внешний символ
Здравствуйте, пытаюсь сделать статический метод, в котором используется статическая переменная....

LNK2001: неразрешенный внешний символ
#include &quot;stdafx.h&quot; #include &lt;GL/glut.h&gt; #include &lt;windows.h&gt; #include &lt;glut.h&gt; #include...

Error LNK2001: неразрешенный внешний символ
Помогите пожалуйста тупому нубу :) Все неприятности начались после добавления дружественного...

3
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
01.05.2018, 15:41 2
Лучший ответ Сообщение было отмечено DrPetr как решение

Решение

DrPetr, extern делает не то, на что ты надеешься.
Посмотри в сторону dllimport и dllexport.

Добавлено через 1 минуту
Думаю, что KATE_API это и делает. Добавь этот макрос к своим переменным.
1
3 / 3 / 4
Регистрация: 29.10.2016
Сообщений: 18
01.05.2018, 16:40  [ТС] 3
Спасибо, nonedark2008, помогло добавление макроса KATE_DLL_IMPORT, но!

появилось предупреждение:
1>d:\проекты\kate\kate\core\float2x2.cpp(6) : warning C4273: 'Kate::Math::float2x2_zero' : inconsistent dll linkage
1> d:\проекты\kate\kate\core\float2x2.h(64) : see previous definition of 'float2x2_zero'
1>d:\проекты\kate\kate\core\float2x2.cpp(7) : warning C4273: 'Kate::Math::float2x2_identity' : inconsistent dll linkage
1> d:\проекты\kate\kate\core\float2x2.h(65) : see previous definition of 'float2x2_identity'


Чем это вызвано, как с этим бороться и что будет если оставить всё как есть?

файл "Float2x2.h"
C++
1
2
3
4
...
extern KATE_DLL_IMPORT float2x2 float2x2_zero;
extern KATE_DLL_IMPORT float2x2 float2x2_identity;
...
файл "Float2x2.cpp"
C++
1
2
3
4
...
float2x2 float2x2_zero( float2( 0.0f, 0.0f ), float2( 0.0f, 0.0f ) );
float2x2 float2x2_identity( float2( 1.0f, 0.0f ), float2( 0.0f, 1.0f ) );
...
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
01.05.2018, 19:51 4
DrPetr, необходимо, чтобы в проекте, где собирается dll макрос KATE_DLL_IMPORT разворачивался в dllexport, а там, где эта dll подключается - в dllimport.

Добавлено через 3 минуты
И стоит учесть, что KATE_DLL_IMPORT нужно прописывать только в заголовочных файлах.
0
01.05.2018, 19:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2018, 19:51
Помогаю со студенческими работами здесь

Error LNK2001: неразрешенный внешний символ
Всем привет. Столкнулся с ошибкой : error LNK2001: неразрешенный внешний символ. 1&gt;------...

Error LNK2001: неразрешенный внешний символ
имеется ошибка 1&gt; Создается библиотека .\ReleaseMinSize/AddIn.lib и объект...

Error LNK2001: неразрешенный внешний символ
Доброго времени суток. Прочитал кучу страниц форума по поиску выданных, но так и не понял - что...

Error LNK2001: неразрешенный внешний символ
Приветствую. Подскажите пожалуйста почему программа не хочет компилироваться. Имеется...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru