P i
P i

Reputation: 30734

XCode build fail: C++ lib within iOS lib within (test) consumer app

I've got three layers:
- core C++ engine
- iOS audio wrapper
- demo iOS consumer project

enter image description here

So I am:
1) compiling engine.a, which links against accelerate framework.

enter image description here

2) compiling wrapper.a, with a dependency on engine and linking against engine.a AND accelerate framework.

enter image description here

So far so good. I can build wrapper.a. But something looks wrong. My wrapper code is using CoreAudio calls. It is fetching real-time microphone data. It should be reporting errors, surely? It should be requiring me to link AudioToolbox or AudioUnit frameworks.

So I don't see why that library even compiles.

3) create a fresh iOS project that links against wrapper.a.

enter image description here

Now I'm getting a 30+ build errors:

```
Undefined symbols for architecture x86_64: "vtable for std::exception", referenced from: std::__1::bad_function_call::bad_function_call() in libfftDecoder.a(FFTDecoder.o) NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.

"std::__1::__thread_struct::__thread_struct()", referenced from: std::__1::thread::thread(void (DecoderThread::&&)(), DecoderThread&&) in libfftDecoder.a(FFTDecoder.o)

"std::__1::__throw_system_error(int, char const*)", referenced from: std::__1::thread::thread(void (DecoderThread::&&)(), DecoderThread&&) in libfftDecoder.a(FFTDecoder.o) : ```

Can anyone suggest what might be the problem? That first error kind of looks like 'failing to process a C++ construct'.

I should mention that Xcode is very disappointing in the context of this task. The items I link against in the 'build phases' tab are not consistently reflected in the project navigator's "frameworks" folder for the respective project. Also sometimes a .a appears red even when it built successfully.

Upvotes: 0

Views: 102

Answers (1)

P i
P i

Reputation: 30734

First point (thanks @wiliz on #iphonedev Freenode) is that a static library has no concept of linking against something. So I should be removing all the links from my .a files and putting all of the dependencies in my consumer app.

The problem was that the library contains compiled C++ code. And the consumer app doesn't have any .mm files. So it isn't using ObjC++ anywhere. So it isn't linking against the C++ stdlib.

Simply renaming one of the .m files (say ViewController.m) to .mm fixes the problem.

Upvotes: 0

Related Questions