Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Building static C++ lib for use with Objective-c app in Xcode 4

I found examples and posts to

  • Create a static C++ lib for use in a C++ application
  • Create a static Objective C lib for use in an Objective C app.

What I couldn't find and have hassled around with for days now, is the correct way to create a static C++ lib for use in a Objective-C app under XCode 4.

I just want to use this very simple code for testing purposes:

#include <iostream>
#include "myCppLib.h"

using namespace std;

extern "C" void show_the_world() {
    cout << "Hello, world!\n";
}

I compile this with armv6/armv7 target, GCC 4.2 compiler, Linking 'C++ Standard Library Type' as 'Static' and have "Symbols Hidden by Default" to YES, as described by the Xcode help for static C++ libs.

My Objective-C app which calls the 'show_the_world' function errors about the std++ lib, which seems not to be included or not correctly referenced:

Undefined symbols for architecture armv6:
 "std::ios_base::Init::~Init()", referenced from:
  ___tcf_0 in libmyCppLib_dev.a(myCppLib.o)
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      _show_the_world in libmyCppLib_dev.a(myCppLib.o)
  "std::ios_base::Init::Init()", referenced from:
  __static_initialization_and_destruction_0(int, int)in libmyCppLib_dev.a(myCppLib.o)
  "std::cout", referenced from:
  _show_the_world in libmyCppLib_dev.a(myCppLib.o)
ld: symbol(s) not found for architecture armv6
collect2: ld returned 1 exit status

I am sure that I compiled the library for the right architecture, so there must be something wrong in another setting or with my code.

Any help is welcome!

Best regards, jimmy

like image 514
Jimmy Koerting Avatar asked Jul 30 '11 11:07

Jimmy Koerting


2 Answers

The correct answer was provided by Jimmy Koerting in the comments: the app needs to be linked against libstdc++.dylib to resolve the standard library symbols. Thanks to Jimmy Koerting, but one more thing i want to add here is, if you are using xcode latest version with iOS 6.1 please add this libstdc++.6.dylib

like image 188
user2134566 Avatar answered Nov 18 '22 21:11

user2134566


Answered in my own comment ;)

the point was to include the std++ lib into the compiling of the resulting objective-c project, too.

like image 31
Jimmy Koerting Avatar answered Nov 18 '22 22:11

Jimmy Koerting