加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

链接目标c

发布时间:2020-12-16 10:27:01 所属栏目:百科 来源:网络整理
导读:我试图弄清楚为什么当我将我的main.m文件转换为main.mm文件时,它不再正确链接. 我已将问题减少到以下示例代码: #import Foundation/Foundation.h#import AppKit/AppKit.hint main( int argc,const char ** argv ) {return NSApplicationMain( argc,argv);}
我试图弄清楚为什么当我将我的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 now 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 **)’

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

我试图在目标c程序中添加一些C类,这阻止了我继续.

感谢您提供任何帮助.

解决方法

问题是当你把它编译成C时,编译器符号NSApplicationMain的 mangles the name,所以它找不到它,因为它正在寻找像__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

为了避免这个问题,需要使用extern "C"修饰符声明C函数,以告诉编译器不要破坏名称.查看< AppKit / NSApplication.h&gt ;,声明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头文件似乎根本不包含任何外部“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”声明.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读