注意事项
1.静态库中采用ObjectC++实现,因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm),或者在工程属性中指定编译方式,即将XCode的Project -> Edit Active Target -> Build -> GCC4.2 - Language -> Compile Sources As设置为"Objective-C++";
2. 文件是里面既有obj_c的代码,也有c++的代码,后缀为.mm是告诉编译器的,其实只需要调用这个c++头文件的类,后缀名改成.mm就可以了。(把OC的源文件后缀名.m改成.mm ,就可以在里面写C++的代码了;)
obj-c 的文件有 .h 和 .m
c 的文件有 .h 和 .c
c++ 的文件有 .h 和 .cpp
假设:
1 我们的项目要使用 C 库(即 在 xcode 中添加 .a 的静态库,静态库中 封装的是 C 逻辑), 那么我们只需要添加静态库 以及加入 C 库中的头文件 ,然后直接调用 C 库中头文件声明的方法。
2 我们的项目中使用 C++库(在 xcode 中添加.a 静态库,静态库中封装 C++ 写的逻辑), 那么我们只需要添加静态库 以及加入 C++ 库中的头文件 ,然后直接调用 C++ 库中头文件声明的方法(还须修改一下编译环境 compile source as 的值为 objective-c ++ ,默认的是According to file type).
3 我们的项目中使用 C库 和 C++ 库 , 那么 要在 2 的基础之上 ,再他 所有的.c /.cpp 文件 改为 .mm 文件。 这样才能通过编译。
综上所述:
如果 使用 C 静态库能满足 我们的所有需求,就不要使用 C++ 库,并且尽量避免三者混编。因为代价很大,要修改所有的 实现文件为 .mm 文件。
展示:
第一步:把你所要edit的oc类的.m文件改后缀.mm,灰常简单
第二步:设置c++所需要的编译源为: Compile Sources As设置为"Objective-C++"
第三步:设置命名空间和导入头文件
例如:
#include <iostream>
using namespace std;
步骤:
1.c++
- // People.h
- #ifndef __MXCPPTest__People__
- #define __MXCPPTest__People__
- #include <iostream>
- class People
- {
- public:
- void say(const char * words);
- };
- #endif
-----------------
- //
- // People.cpp
- // MXCPPTest
- //
- // Created by fengshaobo on 12-11-27.
- // Copyright (c) 2012年 fengshaobo. All rights reserved.
- //
- #include "People.h"
- void People::say(const char *words)
- {
- std::cout << words << std::endl;
- }
2.oc封装
- //
- // Student.h
- // MXCPPTest
- //
- // Created by fengshaobo on 12-11-27.
- // Copyright (c) 2012年 fengshaobo. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "People.h"
- @interface Student : NSObject
- {
- People *p;
- }
- - (void)say:(NSString *)words;
- @end
-----------------
- //
- // Student.mm
- // MXCPPTest
- //
- // Created by fengshaobo on 12-11-27.
- // Copyright (c) 2012年 fengshaobo. All rights reserved.
- //
- #import "Student.h"
- @implementation Student
- - (void)say:(NSString *)words
- {
- p->say([words UTF8String]);
- }
- @end
3.将.m -> .mm
- //
- // ViewController.mm
- // MXCPPTest
- //
- // Created by fengshaobo on 12-11-27.
- // Copyright (c) 2012年 fengshaobo. All rights reserved.
- //
- #import "ViewController.h"
- @interface ViewController ()
- @end
- @implementation ViewController
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- Student *s = [[Student alloc] init];
- [s say:@"hello world!"];
- [s release];
- s = nil;
- }
- - (void)didReceiveMemoryWarning
- {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
- @end