Ошибки "Неразрешенный внешний символ"
Я использую пример программы, которая должна позволять управлять MIDI-устройствами по протоколу OSC.
То, что я сделал, загрузил SDK отсюда: http://mac.softpedia.com/get/Development/Libraries/oscpack.shtml
В папке "examples" содержится файл с именем "SimpleSend.cpp". Код для этого выглядит следующим образом:
#include "osc/OscOutboundPacketStream.h"
#include "ip/UdpSocket.h"
#define ADDRESS "127.0.0.1"
#define PORT 7000
#define OUTPUT_BUFFER_SIZE 1024
int main(int argc, char* argv[])
{
UdpTransmitSocket transmitSocket( IpEndpointName( ADDRESS, PORT ) );
char buffer[OUTPUT_BUFFER_SIZE];
osc::OutboundPacketStream p( buffer, OUTPUT_BUFFER_SIZE );
p << osc::BeginBundleImmediate
<< osc::BeginMessage( "/test1" )
<< true << 23 << (float)3.1415 << "hello" << osc::EndMessage
<< osc::BeginMessage( "/test2" )
<< true << 24 << (float)10.8 << "world" << osc::EndMessage
<< osc::EndBundle;
transmitSocket.Send( p.Data(), p.Size() );
}
Я открыл Visual C++ и создал новый (консольное приложение CLR) проект под названием "osctemp". Я копирую код из файла SimpleSend.cpp и вставляю его в основной файл cpp, созданный для моего проекта, сохраняя следующие строки кода из файла проекта по умолчанию:
#include "stdafx.h"
using namespace System;
Затем я перехожу к заголовочному файлу stdafx.h и замечаю, что он содержит внизу строку:
// TODO: reference additional headers your program requires here
... Так что я послушно перемещаю include и определения из моего основного файла cpp сюда.
Я также заметил, что мне нужно добавить включения в мой проект, поэтому в проводнике Windows я копирую папки "osc" и "ip" в папку моего проекта.
При запуске я получаю следующие ошибки:
1> ------ Начата сборка: Проект: osctemp, Конфигурация: Отладка Win32 ------
1> stdafx.cpp
1> AssemblyInfo.cpp
1> osctemp.cpp
1> Генерация кода...
1>.NETFramework, Version = v4.0.AssemblyAttributes.cpp
1> osctemp.obj: ошибка LNK2028: неразрешенный токен (0A00000A) "public: char const * __thiscall osc::OutboundPacketStream::Data(void)const " (?Data@OutboundPacketStream@osc@@$$FQBEPBDXZ), на который есть ссылка в функции " int __cdecl main (int, char * * const) "(? main @@ $$ HYAHHQAPAD @ Z)
1> osctemp.obj: ошибка LNK2028: неразрешенный токен (0A00000B) "public: unsigned int __thiscall osc::OutboundPacketStream::Size(void)const " (?Size@OutboundPacketStream@osc@@$$FQBEIXZ), на который есть ссылка в функции "int __cdecl main (int, char * * const) "(? main @@ $$ HYAHHQAPAD @ Z)
1> osctemp.obj: ошибка LNK2028: неразрешенный токен (0A00000C) "public: void __thiscall UdpSocket::Send(char const *,int)" (?Send@UdpSocket@@$$FQAEXPBDH@Z), на который есть ссылка в функции "int __cdecl main (int, char * * const) "(? main @@ $$ HYAHHQAPAD @ Z)
... (и еще много таких)...
1> D: \ Temp \ OSCTEMP \ osctemp \ Debug \ osctemp.exe: фатальная ошибка LNK1120: 40 неразрешенных внешних проблем
Что я пропустил?
2 ответа
Из описания вашей проблемы я не могу найти ничего о том, как вы ссылаетесь на библиотеки SDK. Вы сделали это?
Для связи с библиотеками SDK вам понадобится один или несколько файлов.lib. Даже если SDK распространяется как DLL, вам нужен файл lib для компоновки во время сборки. Вы должны прочитать документацию SDK и найти рекомендации по зависимостям ссылок.
Если вы не можете найти какие-либо lib-файлы в дистрибутиве SDK, вполне возможно, что вам нужно сначала собрать SDK для создания библиотеки, а затем создать ссылку на нее. В качестве альтернативы, если SDK поставляется с готовым проектом VS, вы можете добавить его в свое решение и настроить свой собственный проект в зависимости от него (т. Е. VS выполняет работу по поиску выходного lib и связыванию с ним).
Опять же, если SDK имеет какой-либо стандарт спуска, должны быть документы о создании SDK самостоятельно, если это необходимо.
Удачи.
Вы либо не загружаете правильную библиотеку, либо ваш прототип неправильно определяет библиотечную функцию в соответствии с тем, что в ней находится.