gpt4 book ai didi

c++ - 链接 Objective-C++

转载 作者:太空狗 更新时间:2023-10-29 19:45:02 24 4
gpt4 key购买 nike

我想弄清楚为什么当我将 main.m 文件转换为 main.mm 文件时,它不再正确链接。

我已将问题简化为以下示例代码:

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
int main( int argc, const char ** argv ) {
return NSApplicationMain( argc, argv);
}

我正在使用 gnustep 和 linux。我输入以下命令,一切都按预期工作:

g++ -g -c main.m -I/usr/GNUstep/Local/Library/Headers -I/usr/GNUstep/System/Library/Headers

g++ -g -o test main.o -L/usr/GNUstep/Local/Library/Libraries -L/usr/GNUstep/System/Library/Libraries -lgnustep-base -lgnustep-gui

现在,如果我将 main.m 重命名为 main.mm 并使用这两个命令(相同的 exept main.m 现在是 main.mm):

g++ -g -c main.mm -I/usr/GNUstep/Local/Library/Headers -I/usr/GNUstep/System/Library/Headers

g++ -g -o test main.o -L/usr/GNUstep/Local/Library/Libraries -L/usr/GNUstep/System/Library/Libraries -lgnustep-base -lgnustep-gui

我收到以下错误:main.mm:7: 对 `NSApplicationMain(int, char const**)' 的 undefined reference

有人可以找出我做错了什么吗?我不明白为什么它现在无法链接。

我正在尝试将一些 C++ 类添加到 objective-c 程序中,这使我无法继续。

感谢您提供的任何帮助。

最佳答案

问题是当你将它编译为 C++ 时,编译器 mangles the name符号 NSApplicationMain , 所以它找不到它,因为它正在寻找类似 __Z17NSApplicationMainiPPKc 的东西.您可以使用 nm程序(来自 binutils)以查看目标文件引用的符号:

$ # When compiled as Objective-C:
$ nm main.o | grep NSApplicationMain
U NSApplicationMain
$ # When compiled as Objective-C++:
$ nm main.o | grep NSApplicationMain
U _Z17NSApplicationMainiPPKc

为了避免这个问题,C 函数需要声明为 extern "C" 修饰符以告诉编译器不要破坏名称。调查<AppKit/NSApplication.h> ,头文件,其中 NSApplicationMain已声明,我看到了:

APPKIT_EXPORT int
NSApplicationMain(int argc, const char **argv);

唉,APPKIT_EXPORT被定义为 extern 之一, __declspec(dllexport) , extern __declspec(dllexport) , 或者 <AppKit/AppKitDefines.h> 中什么都没有.由于它也用于全局变量声明,我们无法通过将其重新定义为 extern "C" 来解决这个问题。 (无论如何这将是非常hacky和kludgy)。 AppKit 头文件似乎不包含任何 extern "C"声明,尽管我确实在 Foundation/ 下的各种头文件中看到它们和 GNUStepBase/ .

那你能做什么?解决方案是用 extern "C" 包装您的包含:

extern "C"
{
#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
}

int main( int argc, const char ** argv ) {
return NSApplicationMain( argc, argv);
}

这将为那些头文件中定义的函数提供正确的链接,并且一切都会成功。但你不应该这样做——我会用 GNUstep 提交错误报告,告诉他们添加适当的 extern "C"对其头文件的声明。

关于c++ - 链接 Objective-C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1995546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com