2016-09-09 2 views
1

Я знаю, что в swift можно взаимодействовать с c, используя функцию attr для функции в быстром модуле @_silgen_name. Есть ли способ сделать это с символом, определенным в файле сборки? Я бы хотел сделать syscalls с помощью Swift. Вот почему я спрашиваю., вызывающий функцию, определенную в сборке из swift

+0

Скомпилированный объектный файл не имеет понятия, был ли он скомпилирован с C или собран на языке ассемблера. –

+0

@PaulGriffiths, как компилятор знает, где символ, который находится в asm-файле, когда он компилирует быстрый модуль? –

+0

Точно так же, как он знает, где символ с исходным C-файлом - он выглядит в таблице символов объектного файла. –

ответ

2

Создайте файл bridge.h и поместите прототип функции в этот файл.

Например ваш код сборки:

.globl _add // make it global so that others can find this symbol 
.... 
_add: // int add(int a, int b) 
    movl %esi, %eax 
    addl %edi, %eax 
    ret 

Затем в преодолении header.h файл

int add(int a, int b); 

ИЛИ

определить это в верхней части модуля быстрого

@_silgen_name("add") func add(a: Int32, b: Int32) -> Int32 

Затем в swift вы можете использовать его:

let a = add(1, 2); 
+0

Какие флаги я могу передать в компилятор swiftc, чтобы связать файл сборки? –

+0

Просто введите один и тот же проект XCode. –

+0

Я делаю это на Linux, без xcode. –

Смежные вопросы