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 &lt;iostream&gt;”,因为它已经包含在 .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查看调用)

gtkmm 链接器错误

ld:找不到-lPods-App clang 的库:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

无法使用命令行链接库(错误 LNK2019)

从命令行打开应用程序:OSX

编译 mex 文件时出现链接错误