我想通了什麼事情。快速的interop層不夠聰明,無法理解czmq的作者以更好的代碼的名義在編譯器工具鏈中扮演的竅門,因此我們必須做一些C封裝來將其隱藏起來。
易位:
- 從橋接報
- 取出
#include <czmq.h>
行添加一行輸入您選擇的另一頭(我選擇szsocket.h
,因爲它是迅速zsocket包裝)
- 創建對應.c文件和
#import <czmq.h>
較硬位:
您需要重新創建庫中使用的頭中的任何結構。在我的情況下,其被定義爲zsock_t
結構如下:
typedef struct zsock_t {
uint32_t tag; // Object tag for runtime detection
void *handle; // The libzmq socket handle
char *endpoint; // Last bound endpoint, if any
char *cache; // Holds last zsock_brecv strings
int type; // Socket type
size_t cache_size; // Current size of cache
} zsock_t;
我們創建了一個簡單的包裝,像這樣:
typedef struct szsock_t {
uint32_t tag; // Object tag for runtime detection
void *handle; // The libzmq socket handle
char *endpoint; // Last bound endpoint, if any
char *cache; // Holds last zsock_brecv strings
int type; // Socket type
size_t cache_size; // Current size of cache
} szsock_t;
你也將需要重新創建這些結構中使用任何類型定義。在這種情況下,無需其他人。這些都在新的標題(.h)文件中
然後您需要將接受這些結構之一的函數包裝在庫中。我們以zsock_new
函數爲例。
首先,我們需要在頭文件中預先聲明我們的版本以避免任何zsock類型。我們只需更換的zsock
每一次出現szsock
(Emacs可以在這方面幫助):
szsock_t *szsock_new (int type, const char *filename, size_t line_nbr);
接下來我們需要在.c文件創建包裝函數:
szsock_t *szsock_new (int type, const char *filename, size_t line_nbr) {
return (szsock_t *) zsock_new(type, filename, line_nbr);
}
注意我們之間怎麼投zsock_t
和szsock_t
並使用內部zsock函數。這樣做是安全的,因爲swift編譯器不會讀取它,只是c編譯器。
接下來,有一堆可變參數函數。這對我有效:
int szsock_bind (szsock_t *self, const char *format, ...) {
int ret;
va_list args;
va_start(args, format);
ret = zsock_bind((zsock_t *) self, format, args);
va_end(args);
return ret;
}
祝你好運,任何人閱讀包裝圖書館迅速!
來源
2014-11-22 09:27:34
jjl