如何为ios应用程序构建和使用C ++静态库

时间:2013-09-15 09:59:10

标签: c++ ios objective-c xcode static-libraries

我知道如何在xcode 4.6中使用iOS->Framework&Library->Cocoa Touch Static Library构建一个对象C静态库,并且在本教程Creating a Static Library in iOS Tutorial的帮助下很简单。但是,我不确定的一件事是如何为io应用程序构建和使用纯C ++静态库。为了构建C ++静态库,我也使用iOS->Framework&Library->Cocoa Touch Static Library指南,不同之处在于我在创建静态库项目时删除了所有.h和.m文件,然后将所有C ++静态库头文件和项目中的实现文件。一个非常简单的例子如下:

hello.h

#include <iostream>
void say_hello();

HELLO.CPP

#include "hello.h"

void say_hello()
{
std::cout<<"hello"<<std::endl;
}

看起来很有效,我可以为iPhone 6.1 Simulator构建hello.a静态库。下一步是构建一个将调用静态库的应用程序。我为iPhone 6.1 Simulator构建了一个简单的iOS application->Single View Application,然后尝试在hello.a文件中调用ViewController.mm静态库(将ViewController.m更改为ViewController.mm,以便它可以调用C ++函数)只需使用以下代码:

say_hello();

但是,我收到一条警告和两条错误消息:

警告:

ld: warning: ignoring file hello.a, file was built for archive which is not the architecture being linked (i386): 

错误1:

hello.a
Undefined symbols for architecture i386:
  "say_hello()", referenced from:
      -[ViewController viewDidLoad] in ViewController.o

错误2:

ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

然后我有几个与此实验相关的问题:

  • 这是创建纯C ++静态库的正确方法吗?
  • 我调用C ++静态的方式有问题吗? 库中?

  • 在我的例子中,当调用静态库时,我该如何解决链接错误?

非常感谢。

3 个答案:

答案 0 :(得分:7)

这样做,

1)使用相同的方式创建c ++库,iOS-&gt; Framework&amp; Library-&gt; Xcode 6中的Cocoa Touch静态库。

<强> TestCPlusPlus.h

int sub(int a, int b);

<强> TestCPlusPlus.cpp

int sub(int a, int b)
{
 return a - b;
}

2)构建静态库保持配置iOS设备,然后构建iPhone 6(基本模拟器。)

3)然后在“文件浏览器”视图中展开“产品”。选择.a文件,比如libTestStaticLibrary.a,然后选择右键&gt;在Finder中显示。在文件夹中上移。您应该能够看到两个folers Debug-iphoneos和Debug-iphonesimulator

4)现在 打开终端直到此产品路径然后输入

lipo -create Debug-iphoneos / libTestStaticLibrary.a Debug-iphonesimulator / libTestStaticLibrary.a -output libTestStaticLibrary.a

5)现在打开使用该库的项目,需要拖放静态库文件以及具有静态库函数函数声明的头文件。

6)现在,创建Cocoa触摸类文件,它将充当静态库和obejective -c文件之间的适配器。将扩展名更改为 .mm

<强> MyCustomAdaptor.h

@interface MyCustomAdaptor : NSObject

-(int)getSub:(int ) a SecondParam:(int) b;

@end

<强> MyCustomAdaptor.mm

#import "TestCPlusPlus.h"

@implementation MyCustomAdaptor

-(int)getSub:(int ) a SecondParam:(int) b
{
 int c = sub(a,b);
 return c;
}

@end

7)现在在任何目标c文件中使用此MyCustomAdaptor。

答案 1 :(得分:1)

请注意您的.a是使用i386或armv7构建的? 通常,您应该构建两个版本并将它们合并为一个版本。 像这样: lipo -create -output libopencore-amrwb.a libopencore-amrwb-armv7.a libopencore-amrwb-i386.a

答案 2 :(得分:1)

我目前和你一样。我在这里遇到了同样的问题,实际上是两个错误。

当你构建你的库时,你必须记住你将在哪里使用它,iOS设备或模拟器。 这很重要,因为你必须为不同的情况构建,这很简单,当你构建你的库时,只需选中“选择方案”。

对于真实设备使用:

enter image description here

只是在模拟器中测试使用:

enter image description here

构建完成后,将创建的文件拖放到您想要使用库的项目中,您就可以开始了!