Xcode 6.2 OSX其他文件中函数的未定义符号

时间:2015-04-10 19:17:58

标签: xcode macos

我确信这是一个完整的问题,但如果有人能向我解释出了什么问题,我将非常感激。

我在XCode中创建了一个新的Cocoa App。称之为LinkerTest。这个基本的应用程序将构建并运行,放置一个简单的空白窗口。

使用C ++文件模板添加新的.cpp文件。称之为Test.cpp。这也创建了Test.h。

在Test.cpp中添加一个简单的函数:

int TestMe(void)
{
    return 1;
}

在Test.h中声明我的函数

int TestMe(void);

在我的AppDelegate.m(我在创建应用程序时自动创建)添加

#include "Test.h"

在applicationDidFinishLaunching方法中添加:

printf("Test = %d\n", TestMe());

现在尝试构建。一切都编译好,但无法链接。这是链接器命令:

Ld Build/Products/Debug/LinkerTest.app/Contents/MacOS/LinkerTest normal x86_64
cd /Users/chip/LinkerTest
export MACOSX_DEPLOYMENT_TARGET=10.10
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -L/Users/chip/LinkerTest/Build/Products/Debug -F/Users/chip/LinkerTest/Build/Products/Debug -filelist /Users/chip/LinkerTest/Build/Intermediates/LinkerTest.build/Debug/LinkerTest.build/Objects-normal/x86_64/LinkerTest.LinkFileList -Xlinker -rpath -Xlinker @executable_path/../Frameworks -mmacosx-version-min=10.10 -stdlib=libc++ -fobjc-arc -fobjc-link-runtime -Xlinker -dependency_info -Xlinker /Users/chip/LinkerTest/Build/Intermediates/LinkerTest.build/Debug/LinkerTest.build/Objects-normal/x86_64/LinkerTest_dependency_info.dat -o /Users/chip/LinkerTest/Build/Products/Debug/LinkerTest.app/Contents/MacOS/LinkerTest

这是我得到的错误:

Undefined symbols for architecture x86_64:
    "_TestMe", referenced from:
       -[AppDelegate applicationDidFinishLaunching:] in AppDelegate.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

所以我知道我做错了什么?在我看来,添加它应该链接的文件,但它没有。我知道文件Test.cpp被编译,如果我向文件中添加垃圾,那么编译器会立即解决这个垃圾。

编辑:还有其他一些事情。

1)看看这个stackoverflow(Getting XCode to include, compile and link existing (C++) codebase in XCode 4.3(.1))问题看起来很相似,但不是我的问题。我可以确认我的test.cpp列在Build Phases下的Compile Sources中。

2)查看LinkerTest / Build / Intermediates / LinkerTest.build / Debug / LinkerTest.build / Objects-normal / x86_64文件夹,我找到Test.o,Test.d和Test.dia,它告诉我测试.cpp实际上正在编译。在该文件夹中,我还找到了LinkerTest.LinkFileList,当使用文本编辑器打开时,它会显示Test.o应该被链接。

1 个答案:

答案 0 :(得分:0)

答案是,当您创建默认的Cocoa应用程序时,AppDelegate文件是.m文件。将该文件更改为AppDelegate.mm可以解决问题。我不知情的猜测是.m文件只会处理.c文件并正确处理.cpp文件,你必须使用.mm文件。为什么xcode的默认Cocoa应用程序的默认文件不会是.mm文件超出我的工资等级,但它就是。