繁体   English   中英

Objective-C / C ++-链接器错误/方法签名问题

[英]Objective-C/C++ - Linker error/Method Signature issue

我在C ++标头中定义了一个静态类Pipe。

我感兴趣的静态方法(来自Objective-c)在这里:

static ERC  SendUserGet(const UserId &_idUser,const GUID &_idStyle,const ZoneId &_idZone,const char *_pszMsg);

我可以访问似乎存储了userID和zoneID副本的Objective-C数据结构-看起来像:

@interface DataBlock : NSObject
{
    GUID userID;
    GUID zoneID;
}

查找了GUID def,它是一个带有一堆重载运算符的结构,以实现相等性。 第一个函数签名中的UserId和ZoneId是#typedef GUID

现在,当我尝试调用该方法时,无论我如何转换它(常量UserId),(UserId)等,我都会收到以下链接器错误:

Ld build/Debug/Seeker.app/Contents/MacOS/Seeker normal i386
cd /Users/josh/Development/project/Mac/Seeker
setenv MACOSX_DEPLOYMENT_TARGET 10.5
/Developer/usr/bin/g++-4.2 -arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk -L/Users/josh/Development/TS/Mac/Seeker/build/Debug -L/Users/josh/Development/TS/Mac/Seeker/../../../debug -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/gcc/i686-apple-darwin10/4.2.1 -F/Users/josh/Development/TS/Mac/Seeker/build/Debug -filelist /Users/josh/Development/TS/Mac/Seeker/build/Seeker.build/Debug/Seeker.build/Objects-normal/i386/Seeker.LinkFileList -mmacosx-version-min=10.5 -framework Cocoa -framework WebKit -lSAPI -lSPL -o /Users/josh/Development/TS/Mac/Seeker/build/Debug/Seeker.app/Contents/MacOS/Seeker

Undefined symbols:
  "SocPipe::SendUserGet(_GUID const&, _GUID const&, _GUID const&, char const*)", referenced from:
  -[PeoplePaneController clickGet:] in PeoplePaneController.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

这是类型/函数签名错误,还是真正的某种链接器错误? 我有定义所有这些类型和静态类的头文件#imported-我也尝试了#include,以防万一,因为我已经绊脚了:P

原谅我,我来自网络技术背景,所以这种c风格的内存管理和不变性东西非常朦胧。

编辑:添加了完整的链接器错误文本。 将“功能”更改为“方法”。 我还要注意,我们正在使用一个自定义的makefile来编译此项目外部的一些项目。 不过,在此xcode项目中,SocPipe静态方法在其他地方引用,并且似乎可以很好地编译。

(嗯,让我们把评论变成答案。)

方法签名看起来不错; 也就是说,您要调用的内容与标头中声明的内容匹配。 如果不是,则可能是编译错误而不是链接程序错误。

链接器的问题是它没有任何相应的对象代码可将此调用连接到:该方法已声明但从未定义

后者应该出现在您的项目可以编译的C ++源文件中,或者出现在可以链接到的一些预编译的库或框架中。 无论哪种方式,都需要将该文件包含在您的项目中,以便链接器可以使用它。

尚未构建包含Pipe::SendUserGet的对象文件,或者未将其链接到Xcode目标中。 如果在头文件中定义了这些方法,则Pipe其他静态方法是否正常工作不一定重要。

您提到使用外部makefile来构建项目的各个部分。 在这种情况下,仅在编译时作为依赖项运行makefile是不够的-您还必须将生成的产品包括在项目中。

例如,如果你有建立一个makefile libLIBRARY.a ,然后拖动libLIBRARY.a到您的项目,并把它添加到你的目标。

仅当makefile正在构建库时,此方法才有效。 如果makefile生成程序,它将无法正常工作。 如果该库是动态库,它也会变得更加复杂,因为您还必须确保动态库随应用程序一起分发(如果要制作应用程序包,则通常将其放入应用程序包中) 。 如果要构建通用二进制文件,也将变得更加复杂。 从理论上讲,您可以通过正确的CFLAGS make构建,以构建通用库,但是对于每种体系结构运行一次make并使用脚本将结果组合起来可能会更容易(这就是我的工作)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM