一、首先用xcode编写了一个简单的dylib,实现了add方法
1、File-New选择Library建立dylib工程,
2、添加头文件testAdd.h
内容如下:
#ifndef testAdd_h
#define testAdd_h
#ifdef __cplusplus
extern "C" {
#endif
double Add(double a, double b);
#ifdef __cplusplus
}
#endif
#endif /* testAdd_h */
3、添加testAdd.cpp
内容如下:
#include "testAdd.h"
double Add(double a, double b){
return a+b;
}
4、在工程设置里添加了.h和.cpp文件
5、编译后,点击XCode菜单的Product-Show Build Folder In Finder进入文件生成目录,再进入到Products/Debug子目录,发现生成了libtestAdd.dylib文件
二、在app工程里使用这个dylib
1、建立app工程
2、通过dlopen加载dylib并使用
import Cocoa
class ViewController: NSViewController {
typealias addFunc = @convention(c) (CDouble, CDouble) -> CDouble
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let handle = dlopen("libtestAdd.dylib", RTLD_NOW)
if (handle != nil) {
var sym = dlsym(handle, "Add")
if (sym != nil) {
let f = unsafeBitCast(sym, to: addFunc.self)
let result = f(12, 45)
print(result)
}
dlclose(handle)
} else {
let pointer: UnsafeMutablePointer<CChar>? = dlerror()
if let cString = pointer {
let string = String(cString: cString)
print(string)
} else {
print("Pointer is nil")
}
}
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
3、我们运行后发现控制台报错,找不到dylib或者因为sandbox沙盒权限问题,无法加载这个dylib。
4、解决办法:
修改app工程下面你的useTestAdd.entitlements文件里的App Sandbox,将它从YES改为NO。
下面是没改之前的:
下面是改之后的:
再次运行控制台输出正常: