Linker errors in Objective-C++ Metal project - objective-c

I am on El Capitan and I've created a new project through Xcode where I've chosen OS X -> Application -> Game (Language: Objective-C, Game Technology: Metal)
The project compiles and runs without problems initially.
Then I rename the main view controller GameViewController.m to GameViewController.mm to use Objective-C++. When I build now, I get the following linker errors:
Undefined symbols for architecture x86_64:
"_MTKMetalVertexDescriptorFromModelIO", referenced from:
-[GameViewController _loadAssets] in GameViewController.o
"_OBJC_CLASS_$_MDLMesh", referenced from:
objc-class-ref in GameViewController.o
"_OBJC_CLASS_$_MTKMesh", referenced from:
objc-class-ref in GameViewController.o
"_OBJC_CLASS_$_MTKMeshBufferAllocator", referenced from:
objc-class-ref in GameViewController.o
ld: symbol(s) not found for architecture x86_64
I've tried wrapping Metal headers into extern "C" {} though that didn't help.
How can I make it to build?

The reason is that Objective-C has a relatively new feature whereby including a header automatically adds the framework to your link command. The Apple supplied template projects have that feature enabled by default. Hence the list of frameworks in your build settings is empty. By changing the language to Objective-C++ you've walked away from that feature and have to manually add the framework.

Related

AWS IOS SDK 1.7.0 -> Undefined symbols for architecture armv7s:

I'm trying to use the amazon AWS for iOS SDK but I keep getting several Apple Mach-O Linker errors in Xcode 5.0.1
Undefined symbols for architecture armv7:
"_OBJC_CLASS_$_S3CreateBucketRequest", referenced from:
objc-class-ref in CreationViewController.o
"_OBJC_CLASS_$_S3Region", referenced from:
objc-class-ref in CreationViewController.o
"_OBJC_CLASS_$_AmazonEndpoints", referenced from:
objc-class-ref in CreationViewController.o
"_OBJC_CLASS_$_AmazonS3Client", referenced from:
objc-class-ref in CreationViewController.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
I went into the build phases and made sure the AWSES.framework is included in link binary with libraries. In the compile sources CreationViewController.m is also included.
Target Memberships also seem to be correct. What else can I do?
I had the same problem. My solution was to delete the AWSRuntime.framework and the AWSS3.framework from the project. I then went back to the Amazon site to re-download the aws-ios-sdk-1.6.1. Using the Build Phase -> Link Binary Libraries (+) button I added the fresh frameworks back to the Xcode project and it ran with no problems. I had moved the project from Dropbox to a loaner and back again via Dropbox after my hard drive died. My guess is that this corrupted the files or Amazon has something in the code that frowns on copping the it from one place to another rather than getting it straight from them.

Xcode 4 project with external sources (without static library or framework)

Is it possible just to use external sources without making static libraries or something else?
For instance, when I add some files header search path (which is located in the same workspace, so I use ../Project/Project) and add files I need to compile to 'compile sources' in Build phases tab, still got linking error:
Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_CallMe",
referenced from:
objc-class-ref in AppDelegate.o ld: symbol(s) not found for architecture x86_64
You should add files by clicking on File -> Add Files to "<your project>" Xcode does the rest. It isn't necessary to edit the search paths.

"_OBJC_CLASS_$_", referenced from: error in xcode 4.3.2

So today I ran into a major problem. I got a problem involving my viewcontroller on xcode 4.3.2 as seen in the attached code:
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_SecondViewController", referenced from:
objc-class-ref in Birdflix_ProViewController.o
"_OBJC_CLASS_$_ThirdViewController", referenced from:
objc-class-ref in Birdflix_ProViewController.o
"_OBJC_CLASS_$_FourthViewController", referenced from:
objc-class-ref in Birdflix_ProViewController.o
"_OBJC_CLASS_$_Author", referenced from:
objc-class-ref in Birdflix_ProViewController.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
I noticed that these errors only appear when I program IBActions linking my viewcontroller to additional classes. If I delete the IBActions the errors disappear. Any help is appreciated.
Thanks
Please add your SecondViewController.m or SecondViewController.mm, ThirdViewController.m/.mm, FourthViewController.m/.mm, Birdflix_ProViewController.m/.mm files to the Compile sources to build successfully.
To add files to compile source do the following
Build phase in xcode
Select Compile Sources
Press + button to add .m/.mm file
I think that you have added some other static library. And you have not linked it in your project target. Fist clean all targets and build again then check project setting bar shows simulator version properly for active build target.
Hope it will help.

MailCore Errors IOS

I try to use MailCore in my project, but I get these error:
Undefined symbols for architecture armv7:
"_MailCoreEnableLogging", referenced from:
-[ImapSync run] in ImapSync.o
"_OBJC_CLASS_$_CTCoreMessage", referenced from:
l_OBJC_$_CATEGORY_CTCoreMessage_$_CTCoreMessageBuisnessMail in CTCoreMessage+BuisnessMail.o
"_OBJC_IVAR_$_CTCoreMessage.myFields", referenced from:
-[CTCoreMessage(CTCoreMessageBuisnessMail) libetpanDateTime] in CTCoreMessage+BuisnessMail.o
-[CTCoreMessage(CTCoreMessageBuisnessMail) senderDate] in CTCoreMessage+BuisnessMail.o
"_OBJC_CLASS_$_CTCoreAccount", referenced from:
objc-class-ref in AttachmentDownloader.o
objc-class-ref in ImapSync.o
"_MailCoreDisableLogging", referenced from:
-[ImapSync run] in ImapSync.o
"_IfTrue_RaiseException", referenced from:
-[ImapFolderWorker fetchFrom:to:seqDelta:syncingNew:progressOffset:progressTotal:alreadySynced:] in ImapFolderWorker.o
ld: symbol(s) not found for architecture armv7
but all of these methodes are there, I can see them in the MailCoreProject!
I hope someone can help me!
First, I would check if you have added libMailCore-ios.a to your list of "Linked Frameworks and Libraries".
If so, then the problem could be that the MailCore project was compiled for one device while your main project was compiled for a different device. For instance,
the MailCore project was compiled for simulator ... the symbols of MailCore were generated for x86 architecture
your main project was compiled for real iOS device ... so the linker was looking for MailCore symbols for armv7 architecture
Thus, the linker complained, symbols for armv7 architecture not found
To solve the problem, rebuild the MailCore subproject (build-clean and build) with the same device (or same simulator) as your main project.
These could be number of things. How You added MailCore to Your project? As a static library?
You are missing compiled files for armv7 architecture. Make sure that it's added in "build settings" in MailCore project and then try to build it.
You probably build MailCore for the simulator and now You are trying to run it on device. These have to be separated.
Also, You have to be sure that all libraries which MailCore is using, such as libetpan are compiled properly.
PS: adding MailCore to Your project isn't simple process, but it's worth it. :)

symbol(s) not found for architecture armv6

Please help me from the below error.
I am working on graphs using 3rd party framework (libIPhonecharting), every thing works fine in simulator, but when I am trying to build .app file to install in IPAD Device I get the below error message.
ignoring file
/Users/xyz/Desktop/xyzIPAD/library/4.0/Release-iphoneos/libIPhoneCharting.a,
file was built for archive which is not the architecture being linked
(armv6)
Undefined symbols for architecture armv6: "_OBJC_CLASS_$_DTCStroke",
referenced from:
objc-class-ref in DemoLineChart.o "_OBJC_CLASS_$_IPCBar3DChart", referenced from:
objc-class-ref in DemoBar3DChart.o "_OBJC_CLASS_$_IPCLineChart", referenced from:
objc-class-ref in DemoLineChart.o "_OBJC_CLASS_$_DTCDefaultCategoryDataset", referenced from:
objc-class-ref in DemoBar3DChart.o
objc-class-ref in DemoLineChart.o "_DTC_STROKE_CAP_SQUARE", referenced from:
+[DemoLineChart(Private) getRenderWithRender:] in DemoLineChart.o "_OBJC_CLASS_$_IPCTitle", referenced from:
objc-class-ref in DemoBar3DChart.o
objc-class-ref in DemoLineChart.o "_DTC_STROKE_JOIN_BEVEL", referenced from:
+[DemoLineChart(Private) getRenderWithRender:] in DemoLineChart.o ld: symbol(s) not found for architecture armv6
collect2: ld returned 1 exit status
Here's how I got this problem:
I added a .h, .m and NIB from another project by dragging them onto my project navigator. Xcode didn't add them to the Build Phases properly.
My solution for this problem:
Go to the Target in the navigator menu
Click on the "Build Phases" tab
Add the .m file to "Compile Sources" (either drag it across, or use the + button)
Add the .xib to "Copy bundle resources"
Clean and build
It works for me thanks a lot to you
Few questions: Does you external lb have it's own project file? If so make sure that it is configured to build to arm6 and arm7 properly. Do the same for your main project file for good measure. Also, what version of XCOde are you on? There are significant differences between different versions.
Look at the libs scheme (depending on the version of XCode you are using) and make sure that is configured properly for debugging on the iOS device; I assuem you are building to your own device for debugging purposes: this recommendation is because of : "file was built for archive which is not the architecture being linked (armv6)"
After trying each of these things be sure to clean the entire project before each build.
Hope this helps. I feel your pain XCOde is evil.
I solved this issue by adding absent framework to target->Build Phases->Link Binary With Libraries