【问题标题】:'Unresolved external symbol' errors“未解决的外部符号”错误
【发布时间】:2011-09-03 11:16:49
【问题描述】:

我正在使用一个示例程序,它应该允许使用称为 OSC 的协议控制 MIDI 设备。

我所做的是从这里下载 SDK:http://mac.softpedia.com/get/Development/Libraries/oscpack.shtml

“示例”文件夹包含一个名为“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和define从我的主cpp文件移到了这里。

我还注意到我需要将包含添加到我的项目中,因此在 Windows 资源管理器中我将文件夹“osc”和“ip”复制到我的项目文件夹中。

运行时,我收到以下错误:

1>------ Build started: Project: osctemp, Configuration: Debug Win32 ------

1>  stdafx.cpp

1>  AssemblyInfo.cpp

1>  osctemp.cpp

1>  Generating Code...

1>  .NETFramework,Version=v4.0.AssemblyAttributes.cpp

1>osctemp.obj : error LNK2028: unresolved token (0A00000A) "public: char const * __thiscall osc::OutboundPacketStream::Data(void)const " (?Data@OutboundPacketStream@osc@@$$FQBEPBDXZ) referenced in function "int __cdecl main(int,char * * const)" (?main@@$$HYAHHQAPAD@Z)

1>osctemp.obj : error LNK2028: unresolved token (0A00000B) "public: unsigned int __thiscall osc::OutboundPacketStream::Size(void)const " (?Size@OutboundPacketStream@osc@@$$FQBEIXZ) referenced in function "int __cdecl main(int,char * * const)" (?main@@$$HYAHHQAPAD@Z)

1>osctemp.obj : error LNK2028: unresolved token (0A00000C) "public: void __thiscall UdpSocket::Send(char const *,int)" (?Send@UdpSocket@@$$FQAEXPBDH@Z) referenced in function "int __cdecl main(int,char * * const)" (?main@@$$HYAHHQAPAD@Z)

...(And many more like this)...

1>D:\Temp\OSCTEMP\osctemp\Debug\osctemp.exe : fatal error LNK1120: 40 unresolved externals

我错过了什么?

【问题讨论】:

  • 您是否已将源“osc”和“ip”文件夹添加到您的 Visual C++ 项目中?仅仅将它们复制到您的项目在硬盘中的位置是行不通的。
  • @Julio 不,我该怎么做?我已将它们添加到项目树结构中
  • 尝试将源代码文件夹拖到VC++中的项目导航树中?自从我使用 VC 以来已经很久了,所以我不确定拖放是否有效。我想您也可以右键单击项目导航树并为此选择“添加现有文件...”(或类似的)菜单项。
  • @Julio 谢谢,我已经完成了,但它仍然无法编译。我被告知我需要建立自己的图书馆。我不知道那是什么意思!
  • +1 表示尝试做出体面的问题描述。

标签: c++ osc


【解决方案1】:

从您的问题描述中,我找不到有关您如何链接到 SDK 库的任何信息。你这样做了吗?

要与 SDK 库链接,您需要一个或多个 .lib 文件。即使 SDK 作为 DLL 分发,您也需要一个 lib 文件来进行构建时链接。您应该通读 SDK 文档并查找有关链接依赖项的指南。

如果您似乎在 SDK 发行版中找不到任何 lib 文件,则很可能您需要首先构建 SDK 以生成一个库,然后链接到它。或者,如果 SDK 附带一个现成的 VS 项目,您可以将其添加到您的解决方案中并设置您自己的项目以依赖它(即 VS 负责查找输出库并与之链接)。

同样,如果 SDK 符合任何血统标准,如果有必要,应该有关于自己构建 SDK 的文档。

祝你好运。

【讨论】:

  • SDK 中没有 lib 或 dll 文件,但这是一组常用的协议。如果有任何帮助,文档将所有文件统称为“库”“Oscpack 不是 OSC 应用程序框架,它不包括用于构建或路由 OSC 名称空间的基础设施,只是用于轻松构建、发送、接收和解析 OSC 数据包"
  • 就像'mah'我看过它,你需要自己构建它。阅读 SDK 根目录中的 README 文件。这些信息可能对您来说还不够,但它是一个相当标准的过程,因此您可以寻求有关如何从 makefile 构建 SDK 的帮助。比如在这里找这样的帖子,你会发现不少。
【解决方案2】:

您要么没有引入正确的库,要么您的原型没有根据其中的实际内容正确定义库函数。

【讨论】:

  • 我该如何拉库?我已将include文件夹添加到物理目录结构中,并将这些文件夹拖到Visual C++项目的树视图中,但它仍然没有运行
  • SDK 不包含 lib 文件。这是我需要的吗?
  • 您需要修改项目链接器设置以在输入中包含 SDK 的库,并指定它们所在的目录。对于 VS2010,在属性->链接器->常规中,您需要设置“附加库目录”并在属性->链接器->输入中,您需要将它们添加到“附加依赖项”。
  • 我刚刚查看了您链接的 SDK——您需要自己构建它的库,或者至少将它们的源代码包含在您的项目中(ip 和 osc 目录)。
  • 我已经尝试在我的项目中包含 ip 和 osc 目录,但没有奏效,但是构建一个库?这对我来说是新的。你能指点我一些教程吗?我正在谷歌搜索“如何构建 C++ 库”,但似乎没有提供任何有用的提示......
猜你喜欢
  • 2010-11-20
  • 2011-10-21
  • 2012-10-21
  • 2014-05-12
  • 2014-05-14
  • 2021-10-30
  • 1970-01-01
  • 2016-07-10
相关资源
最近更新 更多