11

我知道如何iOS->Framework&Library->Cocoa Touch Static Library在 xcode 4.6 中构建对象 C 静态库,借助本教程在 iOS 教程中创建静态库非常简单。然而,我不确定的一件事是如何为 io 应用程序构建和使用纯 C++ 静态库。搭建C++静态库,我也是用 iOS->Framework&Library->Cocoa Touch Static Libraryguideline,不同的是我在创建静态库项目的时候删除了所有的.h和.m文件,然后把所有的C++静态库头文件和实现文件都放到了项目中. 一个非常简单的例子如下:

你好.h

#include <iostream>
void say_hello();

你好.cpp

#include "hello.h"

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

它似乎有效,我可以hello.a为 iPhone 6.1 Simulator 构建静态库。下一步是构建一个将调用静态库的应用程序。我为 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): 

错误一:

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++ 静态库的方式有问题吗?

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

非常感谢。

4

3 回答 3

8

这会做,

1)使用相同的方法创建c++库,iOS->Framework&Library->Cocoa Touch Static Library in Xcode 6。

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 ,然后选择右键 > 在 Finder 中显示。在文件夹中向上移动。您应该能够看到两个文件夹 Debug-iphoneos 和 Debug-iphonesimulator

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

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

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

6) 现在,创建 Cocoa touch 类文件,它将作为静态库和目标 -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;
}

@结尾

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

于 2015-04-15T09:18:26.473 回答
1

我现在和你做的一样。我遇到了您在此处描述的相同问题,实际上是相同的两个错误。

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

对于真实设备使用:

在此处输入图像描述

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

在此处输入图像描述

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

于 2014-08-26T15:40:13.967 回答
1

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

于 2013-11-22T07:43:22.053 回答