OSX 命令行应用程序链接器错误
Posted
技术标签:
【中文标题】OSX 命令行应用程序链接器错误【英文标题】:OSX command line app linker error 【发布时间】:2014-02-09 02:46:57 【问题描述】:我在 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)
我不明白为什么该函数被更改为名称中带有前导下划线('_print_m')。
为什么会出现这个错误?我需要将 .mm 文件显式添加到项目中吗?
【问题讨论】:
是的,您必须编译.mm
文件并将其与main.m
链接。
您也不需要在 .mm 文件中加倍“#include <iostream>
”,因为它已经包含在 .h 文件中。
【参考方案1】:
您需要更改这些行:
#ifdef __cplus
#include <iostream>
#endif
到您的 .h 文件中的这个:
#ifdef __cplusplus
#include <iostream>
extern "C"
#endif
有同伴:
#ifdef __cplusplus
#endif
在 .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.
【讨论】:
感谢您的回答,但它不能修复链接器错误。 我打错了“#ifdef
”……实际上是“#ifdef __cplusplus
”。你现在应该可以走了。以上是关于OSX 命令行应用程序链接器错误的主要内容,如果未能解决你的问题,请参考以下文章
MAC OSX Xcode 9.2链接器命令失败,退出代码为1(使用-v查看调用)