Я получаю эту ошибку, но я не знаю, как ее исправить.
Я использую Visual Studio 2013. Я сделал имя решения MyProjectTest Это структура моего тестового решения:
Я новичок; это простая программа, и она работает без ошибок. Я читал в Интернете и интересовался unit test, поэтому я создал тестовый проект:
Файл > Создать > Проект. > Установленный > Шаблоны > Visual С++ > Тест > Нативный Unit Test Проект >
Название: UnitTest1 Решение: Добавить в решение Затем местоположение автоматически переключается на путь текущего открытого решения Это структура папок решения:
Я только редактировал файл unittest1.cpp:
Но я получаю ошибку LNK2019: неразрешенный внешний символ. Я знаю, что реализация функции multiple отсутствует. Я попытался удалить файл function.cpp, и я заменил объявление на определение, и он запустился. Но написать декларацию и определение в том же файле не рекомендуется. Как я могу исправить эту ошибку, не делая этого? Должен ли я заменить #include «../MyProjectTest/function.cpp» на файл unittest.cpp? (Я не очень хорошо разбираюсь в английском языке.)
Один вариант — включить function.cpp в ваш проект UnitTest1 , но это может быть не самая идеальная структура решения. Короткий ответ на вашу проблему заключается в том, что при создании проекта UnitTest1 компилятор и компоновщик понятия не имеют, что function.cpp существует, а также не имеет никакого связывания, содержащего определение multiple . Способ исправить это использование библиотек ссылок.
Поскольку ваши модульные тесты находятся в другом проекте, я предполагаю, что вы намерены сделать этот проект автономной программой модульного тестирования. С помощью функций, которые вы тестируете, расположенных в другом проекте, можно построить этот проект либо в динамически, либо в статически связанной библиотеке. Статические библиотеки связаны с другими программами во время сборки и имеют расширение .lib , а динамические библиотеки связаны во время выполнения и имеют расширение .dll . Для моего ответа предпочитаю статические библиотеки.
Вы можете превратить свою первую программу в статическую библиотеку, изменив ее в свойствах проектов. На вкладке «Общие» должна быть опция, для которой проект должен быть установлен в исполняемый файл ( .exe ). Вы можете изменить это на .lib . Файл .lib будет создан в том же месте, что и .exe .
В проекте UnitTest1 вы можете перейти к его свойствам, а на вкладке Linker в категории Дополнительные библиотечные каталоги добавьте путь к созданию MyProjectTest . Затем для дополнительных зависимостей на вкладке Linker — Input добавьте имя вашей статической библиотеки, скорее всего, MyProjectTest.lib .
Это должно позволить вашему проекту строить. Обратите внимание, что, делая это, MyProjectTest не будет автономной исполняемой программой, если вы не измените свои свойства сборки по мере необходимости, что было бы менее идеальным.
reader > >(void)» (??1?$reader@V?$basic_ifstream@DU?$char_traits@D@std@@@std@@@png@@QAE@XZ)
1> : error LNK2019: ссылка на неразрешенный внешний символ _png_get_error_ptr в функции «protected: static void __cdecl png::io_base::raise_error(struct png_struct_def *,char const *)» (?raise_error@io_base@png@@KAXPAUpng_struct_def@@PBD@Z)
1> : error LNK2019: ссылка на неразрешенный внешний символ _png_set_read_fn в функции «public: __thiscall png::reader > >::reader > >(class std::basic_ifstream > &)» (??0?$reader@V?$basic_ifstream@DU?$char_traits@D@std@@@std@@@png@@QAE@AAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@@Z)
1> : error LNK2019: ссылка на неразрешенный внешний символ _png_get_io_ptr в функции «private: static void __cdecl png::reader > >::read_data(struct png_struct_def *,unsigned char *,unsigned int)» (?read_data@?$reader@V?$basic_ifstream@DU?$char_traits@D@std@@@std@@@png@@CAXPAUpng_struct_def@@PAEI@Z)
1> : error LNK2019: ссылка на неразрешенный внешний символ _png_get_valid в функции «public: void __thiscall png::info::read(void)» (?read@info@png@@QAEXXZ)
1> : error LNK2019: ссылка на неразрешенный внешний символ _png_get_IHDR в функции «public: void __thiscall png::info::read(void)» (?read@info@png@@QAEXXZ)
1> : error LNK2019: ссылка на неразрешенный внешний символ _png_set_IHDR в функции «protected: void __thiscall png::info::sync_ihdr(void)const » (?sync_ihdr@info@png@@IBEXXZ)
1> : error LNK2019: ссылка на неразрешенный внешний символ _png_get_PLTE в функции «public: void __thiscall png::info::read(void)» (?read@info@png@@QAEXXZ)
1> : error LNK2019: ссылка на неразрешенный внешний символ _png_get_tRNS в функции «public: void __thiscall png::info::read(void)» (?read@info@png@@QAEXXZ)
Три часа гугления ваще не помогли, если комменчу эту функцию все норм (единственное место где я работаю с этой библиотекой)
Заранее, Всем огромное спасибо за помощь!
Ошибка компоновщика в базовом приложении cocos2dx, работающем в visual studio. Происходит, когда метод AppDelegate «applicationDidFinishLaunching» вызывает метод «singleton» MyGameScene.
Я уже проверил, что методы, определенные в MyGameScene.h, реализованы в классе MyGameScene.cpp.
Сообщение об ошибке
AppDelegate.h
AppDelegate.cpp
MyGameScene.h
MyGameScene.cpp
ОБНОВИТЬ
Я создал новый класс в проекте в самой Visual Studio и скопировал в него все переменные и функции-члены класса MyGame. Затем я смог сослаться на новый класс и правильно скомпилировать.
[Копирование моего комментария здесь, к вашему сведению] Я могу скомпилировать существующую игру cocos2dx на Windows с помощью Cygwin, и мой коллега может скомпилировать то же самое на Mac с помощью XCode. Проблема только во время компиляции с Visual Studio
Я думаю, что Visual Studio не компилирует файл MyGame. Как я могу убедиться, что класс будет скомпилирован?
Решение
Вы пытались установить статическую переменную MyGame вверху файла .cpp?
Создает эту ошибку, если нигде не установлено.
Другие решения
Я думаю, это опечатка. Сообщение об ошибке содержит достаточно информации. «public: static —— class —-
MyGame * __cdecl … «
Я обнаружил, что я не связывал библиотеки cocos2dx должным образом после создания проекта из шаблона. И это было причиной ошибки компоновщика [хотя ошибка указала мне в другом направлении].
Спасибо всем за помощь!
Я планирую перечислить правильные шаги, которые я использовал позже, для создания проекта win32 в Visual Studio 2012 в существующем проекте cocos2dx, для всех, кто посещает этот вопрос с похожей проблемой.
Источник: