I have added a googletest project to my app, but when I try to compile it, I get LNK2019 errors. The main app compiles and runs, but the test app will not compile.
// AstroCalcs.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "Easter.h" int main() { Easter estr; auto result = estr.MyEasterFunc(); return 0; }
// Easter.h #pragma once class Easter { public: Easter(); ~Easter(); int MyEasterFunc() const; };
// Easter.cpp #include "stdafx.h" #include "Easter.h" int Easter::MyEasterFunc() const { return 0; } Easter::Easter() = default; Easter::~Easter() = default;
// AstroCalcsTests.cpp #include "pch.h" #include "../AstroCalcs/Easter.h" TEST(ShouldReturnCorrectEasterYear, GetEasterYear) { Easter estr; const auto result = estr.MyEasterFunc(); ASSERT_EQ(0, result); } TEST(TestCaseName, TestName) { EXPECT_EQ(1, 1); EXPECT_TRUE(true); }
If I remove the test for ShouldReturnCorrectEasterYear, the tests compile and run without a problem. If I add the year test back in, I get the following three error messages:
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol «public: __thiscall Easter::Easter(void)» (??0Easter@@QAE@XZ) referenced in function «private: virtual void __thiscall ShouldReturnCorrectEasterYear_GetEasterYear_Test::TestBody(void)»
(?TestBody@ShouldReturnCorrectEasterYear_GetEasterYear_Test@@EAEXXZ) AstroCalcsTests D:SourcereposAstroCalcsAstroCalcsTestsAstroCalcsTests.obj 1
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol «public: __thiscall Easter::~Easter(void)» (??1Easter@@QAE@XZ) referenced in function «private: virtual void __thiscall ShouldReturnCorrectEasterYear_GetEasterYear_Test::TestBody(void)»
(?TestBody@ShouldReturnCorrectEasterYear_GetEasterYear_Test@@EAEXXZ) AstroCalcsTests D:SourcereposAstroCalcsAstroCalcsTestsAstroCalcsTests.obj 1
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol «public: int __thiscall Easter::MyEasterFunc(void)const » (?MyEasterFunc@Easter@@QBEHXZ) referenced in function «private: virtual void __thiscall ShouldReturnCorrectEasterYear_GetEasterYear_Test::TestBody(void)»
(?TestBody@ShouldReturnCorrectEasterYear_GetEasterYear_Test@@EAEXXZ) AstroCalcsTests D:SourcereposAstroCalcsAstroCalcsTestsAstroCalcsTests.obj 1
In my solution property pages, I have made AstroCalcs a dependency for AstroCalcsTests.
I have tried setting the AstroCalcs configuration type as .exe and as type .lib.
I have tried setting AstroCalcsTests configuration type as .exe and as type .lib.
Rob E.
g8hyp 1 / 1 / 1 Регистрация: 01.06.2009 Сообщений: 38 |
||||||||||||
1 |
||||||||||||
08.04.2017, 18:20. Показов 2569. Ответов 16 Метки нет (Все метки)
В качестве учебной задачки начал реализовывать какое-то подобие вектора, но вот столкнулся с проблемой:
Файл Vector_Class.h Кликните здесь для просмотра всего текста
Файл с main: Кликните здесь для просмотра всего текста
Работаю в VS15. Т.к. нет никаких идей, предполагаю, что ошибка какая-нибудь совсем глупая
__________________
0 |
7275 / 6220 / 2833 Регистрация: 14.04.2014 Сообщений: 26,871 |
|
08.04.2017, 18:23 |
2 |
Сообщение было отмечено g8hyp как решение РешениеПринадлежность к классу укажи в 86-й строке как у прочих функций.
1 |
284 / 232 / 114 Регистрация: 07.09.2016 Сообщений: 584 |
|
08.04.2017, 18:38 |
3 |
Сообщение было отмечено GbaLog- как решение Решение на случай, если не знаете, что означает «принадлежность к классу»: а где конструктор копирования и operator =?
1 |
g8hyp 1 / 1 / 1 Регистрация: 01.06.2009 Сообщений: 38 |
||||||||||||||||
08.04.2017, 19:37 [ТС] |
4 |
|||||||||||||||
nmcf, Да, действительно, очень глупо вышло)
но при попытке
выдаётся ошибка:
Добавлено через 7 минут
Но результат всё тот же…
0 |
nmcf 7275 / 6220 / 2833 Регистрация: 14.04.2014 Сообщений: 26,871 |
||||
08.04.2017, 20:28 |
5 |
|||
0 |
1 / 1 / 1 Регистрация: 01.06.2009 Сообщений: 38 |
|
08.04.2017, 20:59 [ТС] |
6 |
nmcf, Не, не выходит, всё тоже самое
0 |
7275 / 6220 / 2833 Регистрация: 14.04.2014 Сообщений: 26,871 |
|
08.04.2017, 21:01 |
7 |
Ты в самом классе-то функцию исправил?
0 |
g8hyp 1 / 1 / 1 Регистрация: 01.06.2009 Сообщений: 38 |
||||||||
08.04.2017, 21:28 [ТС] |
8 |
|||||||
И в классе:
И в определении:
0 |
DU3 284 / 232 / 114 Регистрация: 07.09.2016 Сообщений: 584 |
||||||||
08.04.2017, 21:33 |
9 |
|||||||
вы зачем-то динамически вектор создали. а раз так — учитывайте то, что у вас указатель.
0 |
g8hyp 1 / 1 / 1 Регистрация: 01.06.2009 Сообщений: 38 |
||||||||||||
10.04.2017, 20:49 [ТС] |
10 |
|||||||||||
Понял свою ошибку, пытался применить оператор [] к указателю, а не к объекту на который он указывает.
Т.к. в конструктор передаётся константная ссылка, необходимо обеспечить чтобы GetSize() и [] были константными методами. Изменяю их:
Как я понял (видимо не правильно), эти методы не должны изменять объект. И если с GetSize() всё понятно, то почему я могу поменять число через []?
0 |
7275 / 6220 / 2833 Регистрация: 14.04.2014 Сообщений: 26,871 |
|
10.04.2017, 21:10 |
11 |
Тебе надо возврат const делать в таком случае.
0 |
1 / 1 / 1 Регистрация: 01.06.2009 Сообщений: 38 |
|
10.04.2017, 21:26 [ТС] |
12 |
Мне не очень понятен смысл константного метода, т.е. после определения которого ставится const, как выше. Я думал, что такой метод не должен изменять содержимое объекта, но это не так. Так зачем же он нужен?
0 |
7275 / 6220 / 2833 Регистрация: 14.04.2014 Сообщений: 26,871 |
|
10.04.2017, 21:29 |
13 |
const в начале относится к возвращаемому значению, а в конце, как у тебя, означает, что функция не изменяет объект. Добавлено через 1 минуту
но это не так Это так. Функция у тебя ничего не изменяет.
0 |
g8hyp 1 / 1 / 1 Регистрация: 01.06.2009 Сообщений: 38 |
||||||||
10.04.2017, 22:04 [ТС] |
14 |
|||||||
Совсем запутался. Объявляю оператор константным:
И с его помощью меняю значение объекта:
UPD: Кажется понял, оператор не меняет объект, но возвращает ссылку через которую можно поменять объект…
0 |
nmcf 7275 / 6220 / 2833 Регистрация: 14.04.2014 Сообщений: 26,871 |
||||
10.04.2017, 22:13 |
15 |
|||
0 |
DU3 284 / 232 / 114 Регистрация: 07.09.2016 Сообщений: 584 |
||||
10.04.2017, 23:46 |
16 |
|||
не то и не другое. нужны две функции, константная и неконстантная. а далее компилятор сам разрулит
0 |
1 / 1 / 1 Регистрация: 01.06.2009 Сообщений: 38 |
|
11.04.2017, 20:32 [ТС] |
17 |
DU3, спасибо! Два функции действительно выглядят логичней
0 |
Hey @nickgillian the example you link to above contains an error, testAccuracy
is undefined.
But in any case, I can also reproduce the unresolved external symbol issue. Steps to reproduce:
- Create a static build or GRT using the cmake build system + Visual Studio 2015 on Windows 10
- Create a new VS solution using the «getting started» solution that links to grt.lib
- Build
The following errors are generated:
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: __thiscall GRT::VectorFloat::VectorFloat(class GRT::VectorFloat const &)" (__imp_??0VectorFloat@GRT@@QAE@ABV01@@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: virtual __thiscall GRT::VectorFloat::~VectorFloat(void)" (__imp_??1VectorFloat@GRT@@UAE@XZ) referenced in function "public: __thiscall GRT::GaussNeuron::~GaussNeuron(void)" (??1GaussNeuron@GRT@@QAE@XZ) ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: double * __thiscall GRT::Matrix<double>::operator[](unsigned int)" (__imp_??A?$Matrix@N@GRT@@QAEPANI@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: unsigned int __thiscall GRT::Matrix<double>::getNumRows(void)const " (__imp_?getNumRows@?$Matrix@N@GRT@@QBEIXZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: unsigned int __thiscall GRT::Matrix<double>::getNumCols(void)const " (__imp_?getNumCols@?$Matrix@N@GRT@@QBEIXZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: virtual __thiscall GRT::MatrixFloat::~MatrixFloat(void)" (__imp_??1MatrixFloat@GRT@@UAE@XZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: unsigned int __thiscall GRT::ClassificationSample::getClassLabel(void)const " (__imp_?getClassLabel@ClassificationSample@GRT@@QBEIXZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: class GRT::VectorFloat & __thiscall GRT::ClassificationSample::getSample(void)" (__imp_?getSample@ClassificationSample@GRT@@QAEAAVVectorFloat@2@XZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: __thiscall GRT::ClassificationData::ClassificationData(unsigned int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (__imp_??0ClassificationData@GRT@@QAE@IV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: __thiscall GRT::ClassificationData::ClassificationData(class GRT::ClassificationData const &)" (__imp_??0ClassificationData@GRT@@QAE@ABV01@@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: virtual __thiscall GRT::ClassificationData::~ClassificationData(void)" (__imp_??1ClassificationData@GRT@@UAE@XZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: class GRT::ClassificationSample & __thiscall GRT::ClassificationData::operator[](unsigned int const &)" (__imp_??AClassificationData@GRT@@QAEAAVClassificationSample@1@ABI@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: bool __thiscall GRT::ClassificationData::load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (__imp_?load@ClassificationData@GRT@@QAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: bool __thiscall GRT::ClassificationData::printStats(void)const " (__imp_?printStats@ClassificationData@GRT@@QBE_NXZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: class GRT::ClassificationData __thiscall GRT::ClassificationData::split(unsigned int,bool)" (__imp_?split@ClassificationData@GRT@@QAE?AV12@I_N@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: unsigned int __thiscall GRT::ClassificationData::getNumSamples(void)const " (__imp_?getNumSamples@ClassificationData@GRT@@QBEIXZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: __thiscall GRT::GestureRecognitionPipeline::GestureRecognitionPipeline(void)" (__imp_??0GestureRecognitionPipeline@GRT@@QAE@XZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: virtual __thiscall GRT::GestureRecognitionPipeline::~GestureRecognitionPipeline(void)" (__imp_??1GestureRecognitionPipeline@GRT@@UAE@XZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: class GRT::GestureRecognitionPipeline & __thiscall GRT::GestureRecognitionPipeline::operator<<(class GRT::Classifier const &)" (__imp_??6GestureRecognitionPipeline@GRT@@QAEAAV01@ABVClassifier@1@@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: virtual bool __thiscall GRT::GestureRecognitionPipeline::test(class GRT::ClassificationData const &)" (__imp_?test@GestureRecognitionPipeline@GRT@@UAE_NABVClassificationData@2@@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: virtual bool __thiscall GRT::GestureRecognitionPipeline::save(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)const " (__imp_?save@GestureRecognitionPipeline@GRT@@UBE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: virtual bool __thiscall GRT::GestureRecognitionPipeline::load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (__imp_?load@GestureRecognitionPipeline@GRT@@UAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: unsigned int __thiscall GRT::GestureRecognitionPipeline::getNumClassesInModel(void)const " (__imp_?getNumClassesInModel@GestureRecognitionPipeline@GRT@@QBEIXZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: unsigned int __thiscall GRT::GestureRecognitionPipeline::getPredictedClassLabel(void)const " (__imp_?getPredictedClassLabel@GestureRecognitionPipeline@GRT@@QBEIXZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: double __thiscall GRT::GestureRecognitionPipeline::getTestAccuracy(void)const " (__imp_?getTestAccuracy@GestureRecognitionPipeline@GRT@@QBENXZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: double __thiscall GRT::GestureRecognitionPipeline::getTestFMeasure(unsigned int)const " (__imp_?getTestFMeasure@GestureRecognitionPipeline@GRT@@QBENI@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: double __thiscall GRT::GestureRecognitionPipeline::getTestPrecision(unsigned int)const " (__imp_?getTestPrecision@GestureRecognitionPipeline@GRT@@QBENI@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: double __thiscall GRT::GestureRecognitionPipeline::getTestRecall(unsigned int)const " (__imp_?getTestRecall@GestureRecognitionPipeline@GRT@@QBENI@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: class GRT::MatrixFloat __thiscall GRT::GestureRecognitionPipeline::getTestConfusionMatrix(void)const " (__imp_?getTestConfusionMatrix@GestureRecognitionPipeline@GRT@@QBE?AVMatrixFloat@2@XZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: class GRT::Vector<unsigned int> __thiscall GRT::GestureRecognitionPipeline::getClassLabels(void)const " (__imp_?getClassLabels@GestureRecognitionPipeline@GRT@@QBE?AV?$Vector@I@2@XZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: __thiscall GRT::ANBC::ANBC(bool,bool,double)" (__imp_??0ANBC@GRT@@QAE@_N0N@Z) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK2019 unresolved external symbol "__declspec(dllimport) public: virtual __thiscall GRT::ANBC::~ANBC(void)" (__imp_??1ANBC@GRT@@UAE@XZ) referenced in function _main ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1ConsoleApplication1.obj 1
Error LNK1120 32 unresolved externals ConsoleApplication1 C:UsersJamie BullockDocumentsml-libbuildwin32ConsoleApplication1DebugConsoleApplication1.exe 1
#include<iostream> #include <list> using namespace std; class Graph { int V; list<int> *adj; public: Graph(int V); void addEdge(int v, int w); void BFS(int s); }; Graph::Graph(int V) { this->V = V; adj = new list<int>[V]; } void Graph::addEdge(int v, int w) { adj[v].push_back(w); } void Graph::BFS(int s) { bool *visited = new bool[V]; for(int i = 0; i < V; i++) visited[i] = false; list<int> queue; visited[s] = true; queue.push_back(s); list<int>::iterator i; while(!queue.empty()) { s = queue.front(); cout << s << " "; queue.pop_front(); for (i = adj[s].begin(); i != adj[s].end(); ++i) { if (!visited[*i]) { visited[*i] = true; queue.push_back(*i); } } } } int main() { Graph g(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 0); g.addEdge(2, 3); g.addEdge(3, 3); cout << "Following is Breadth First Traversal " << "(starting from vertex 2) n"; g.BFS(2); return 0; }
What I have tried:
Severity Code Description Project File Line Suppression State Error LNK2019 unresolved external symbol _WinMain@16 referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) MIbasco_Project7 C:UsersIbascossourcereposMIbasco_Project7MSVCRTD.lib(exe_winmain.obj) 1
This is the error I’m getting. I’m very new to C++ and I don’t have the experience to figure out what I’m doing wrong. I am using VS 2019. I appreciate any help, thank you!
Updated 12-Dec-20 23:20pm
You create a Windows project instead of a Console project. Windows application starts from WinMain()
while console application starts from main()
. Yours is a console application. You have 2 options to fix it: either recreate a new console application project and copy over your source code or follow the steps below.
- Right-click on your project in Solution Explorer and click «Properties» on the popup menu.
- Make sure Configuration and Platform on the Properties Page is same as your current setting.
- Go to Linker->System
- On the Subsystem dropdown, change from Windows(/Subsystem:Windows) to Console(/Subsystem:Console)
- Click Ok to close the Properties Page and rebuild your project.
Updated 12-Dec-20 18:24pm
This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)
CodeProject,
20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8
+1 (416) 849-8900