我在Xcode 5中创建了一个OSX命令应用程序
这是main.m
#import <Foundation/Foundation.h>
#import "ConnectionListener.h"
#import "SOMatrix.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSLog(@"Hello, World!");
print_m();
}
return 0;
}
这是我的头文件:
#ifndef __GDC1__SOMatrix__
#define __GDC1__SOMatrix__
#ifdef __cplus
#include <iostream>
#endif
int print_m();
#endif /* defined(__GDC1__SOMatrix__) */
以下是SOMatrix.mm文件的部分列表
#include "SOMatrix.h"
#include <iostream>
using namespace std;
int print_m() {
// logic removed to keep it short; no compile time error
return 0;
}
当我构建项目时,我收到了链接器错误:
Undefined symbols for architecture x86_64:
"_print_m", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我不明白为什么函数showhow更改为在名称('_print_m')中有一个前导下划线。
为什么会出现此错误?我是否需要将.mm文件明确添加到项目中?
答案 0 :(得分:1)
您需要更改这些行:
#ifdef __cplus
#include <iostream>
#endif
在.h文件中到 此 :
#ifdef __cplusplus
#include <iostream>
extern "C"
{
#endif
与同伴:
#ifdef __cplusplus
}
#endif
<。p>在.h文件的末尾。
因为您正在尝试从Objective-C访问C ++函数,并且C ++倾向于进行一些名称修改(例如,添加下划线)。添加“extern "C"
”位允许Objective-C代码查找C函数声明。 The answers to this related question might elaborate on things a bit better than I can