2014-11-22 38 views
0

我想使用czmq爲zeromq構建Swift綁定。swift zeromq c橋頭 - 無法找到類型

我已經配置在Xcode橋接頭,似乎明白,但我仍然得到這個錯誤:

/Users/jjl/code/swiftzmq/src/zsock.swift:47:37: error: use of undeclared type 'zsock_t' 
typealias zsock_ptr = UnsafePointer<zsock_t> 

在C使用此,我想有這種類型的可如果我這樣做(這是我的橋接報頭的確切內容):

#include <czmq.h> 

我知道它是被包括在內,因爲它是在抱怨的頭文件,直到我被鏈接到的正確庫路徑的一個東西。

我不知道該從哪裏出發。你可以提供任何幫助,將不勝感激

我的項目是在https://github.com/jjl/swiftzmq

回答

0

我想通了什麼事情。快速的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_tszsock_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; 
} 

祝你好運,任何人閱讀包裝圖書館迅速!

相關問題