如何创建静态库,并且可以在ios中的任何项目上添加.a文件.
我试过这样做但是做不到.
提前致谢
我对使用C++库完全不熟悉,所以请理解这可能对我的情况有点具体(让我知道,我可以提供更多细节).
我有一个外部C++库,我正在尝试使用iOS项目.该库遵循configure,make,make构建模式以输出.a库文件.当我尝试将此库文件添加到Xcode时,我收到以下错误:
忽略文件/Users/Developer/iOS/TestProj/libpresage.a,文件是为归档而构建的,而不是被链接的体系结构(i386):
/Users/Developer/iOS/TestProj/libpresage.a
基于这个问题,我尝试将Build Active Architecture Only转为NO,我得到了同样的错误.这让我怀疑我为不正确的架构编译了库.
在.a文件上运行lipo -info给出:
输入文件libpresage.a不是胖文件非胖文件:libpresage.a
是架构:x86_64
鉴于这不是armv7s,armv7或arm64,我尝试使用以下参数再次编译C++库:
1)试试
./configure CC="gcc -arch armv7s" \
CXX="g++ -arch armv7s" \
CPP="gcc -E" CXXCPP="g++ -E"
Run Code Online (Sandbox Code Playgroud)
编译时出错,我得到:
ld: library not found for -lcrt1.3.1.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
2)试试
./configure CC="gcc -arch arm64" \
CXX="g++ -arch arm64" \
CPP="gcc -E" CXXCPP="g++ -E"
Run Code Online (Sandbox Code Playgroud)
编译时出错,我得到:
ld:警告:ld:警告:忽略文件/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libSystem.dylib,缺少所需的架构arm64 in文件/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libSystem.dylib(2个切片)忽略文件/Applications/Xcode.app/Contents/开发人员/平台/ MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libstdc ++.dylib,在文件/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer中缺少所需的架构arm64 /SDKs/MacOSX10.10.sdk/usr/lib/libstdc++.dylib(2片)
ld:动态主可执行文件必须与libSystem.dylib链接,用于体系结构arm64 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
有什么明显的东西让我失踪吗?
编辑:
感谢您的回复,所以我设法将库作为自定义构建目标放入Xcode,将'make'命令指向库MakeFile.这个构建很好.
我从这里开始:
我有一个std::vector充满了物体.我想过滤并复制一些谓词返回的所有元素true到一个新的元素std::vector.
我看过find并且search函数但是它们只返回迭代器.
我正在使用ObjC++,所以我可以使用块函数和仿函数,如果它有帮助的话.但是不能使用C++ 11函数.
我想为iPhone创建一个可移植的库,也可以用于其他平台.
我的问题是休息:
有谁知道iPhone上最好用的是什么:Objective-C或Objective-C++?它是否适用于C++与Objective-C与C相同?
理由: Objective-C是C的超集,但Objective-C++ is not是C++ 的超集.
提前致谢!
更新:在同一个用例的实现中,内存使用情况,速度如何?
更新1:如果有人可以提供更多信息,我将受到欢迎.
我想知道哪种方法更好地将const char*string转换为NSString.
我发现有一些事实.
但我想用长度和编码进行转换(因为如果我通过将编码设置为UTF-8而有一些非ASCII字符,我想要那么好).有什么想法吗?
我现在才想
但它效果不好.
我有一个Objective-C++类,它包含一些诚实的C++对象指针.
当Obj-C++类被销毁时,它会立即调用dealloc吗?如果是这样,那么通过put来破坏C++类是最好的方法
delete obj
Run Code Online (Sandbox Code Playgroud)
在dealloc方法?
所以,我刚刚升级到Xcode 4.4,我注意到在更改日志中:
Apple LLVM编译器支持其他C++ 11功能,包括lambdas
哪个太棒了!所以我开始编码,我找到了一些东西:
Lambdas可分配给Objective-C块:
void (^block)() = []() -> void {
NSLog(@"Inside Lambda called as block!");
};
block();
Run Code Online (Sandbox Code Playgroud)std::function 可以持有Objective-C块:
std::function<void(void)> func = ^{
NSLog(@"Block inside std::function");
};
func();
Run Code Online (Sandbox Code Playgroud)我们不能将一个Objective-C块分配给lambda:
auto lambda = []() -> {
NSLog(@"Lambda!");
};
lambda = ^{ // error!
NSLog(@"Block!");
};
lambda();
Run Code Online (Sandbox Code Playgroud)为什么是这样?鉴于我们上面所看到的,这两者在语义上是否应该是等价的?
在我的项目中,核心库是C/C++文件的一部分,而UI需要在Objective C中开发,我能够从Objective C/.mm文件访问/调用C++函数,但到目前为止没有反转,即我不是能够从C++文件调用Objective C函数,当我试图包括Objective C头甚至系统头
#import <foundation/foundation.h>
Run Code Online (Sandbox Code Playgroud)
大约1000+编译错误,
这样的事情
/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:180:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:180: error: expected unqualified-id before '@' token
/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:182:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:182: error: expected initializer before '*' token
/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183: error: 'NSString' was not declared in this scope
/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183: error: 'aSelectorName' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
我错过了一些预编译标志等..任何人都可以建议我,最好的方式来调用/访问从NSObject继承的目标C类,而不需要修改很多C++代码,我只需要调用一个函数
代码结构/包含头文件的顺序是
Some system header file
Some Core Class Header file
#import <foundation/foundation.h>
Run Code Online (Sandbox Code Playgroud) 我在录制音频时为中断通知添加了一个观察者.
这在执行拨出电话,接听来电而不是应答,Siri等时工作正常.
现在我的应用程序在后台运行,屏幕顶部有红色条,继续上述状态下的录制不是问题.
但是当我真正接听来电时.我收到另一个AVAudioSessionInterruptionTypeBegan通知,然后当我停止通话时,我从未收到通知AVAudioSessionInterruptionTypeEnded类型.
我已经尝试使用CTCallCenter来检测呼叫何时开始,但我无法从该回调重新开始录制.
有谁知道如何让中断机制与实际得到回答的来电一起工作?
这是我正在使用的代码(的一部分);
CFNotificationCenterAddObserver(
CFNotificationCenterGetLocalCenter(),
this,
&handle_interrupt,
(__bridge CFStringRef) AVAudioSessionInterruptionNotification,
NULL,
CFNotificationSuspensionBehaviorDeliverImmediately );
Run Code Online (Sandbox Code Playgroud)
...
static void handle_interrupt( CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo )
{
au_recorder *recorder = static_cast<au_recorder*>( observer );
NSNumber* interruptionType = [( ( __bridge NSDictionary* ) userInfo ) objectForKey:AVAudioSessionInterruptionTypeKey];
switch ( [interruptionType unsignedIntegerValue] )
{
case AVAudioSessionInterruptionTypeBegan:
{
// pause recorder without stopping recording (already done by OS)
recorder->pause();
break; …Run Code Online (Sandbox Code Playgroud)