我知道如何在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 ++静态的方式有问题吗? 库中?
在我的例子中,当调用静态库时,我该如何解决链接错误?
非常感谢。
答案 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设备或模拟器。 这很重要,因为你必须为不同的情况构建,这很简单,当你构建你的库时,只需选中“选择方案”。
对于真实设备使用:
只是在模拟器中测试使用:
构建完成后,将创建的文件拖放到您想要使用库的项目中,您就可以开始了!