2015-03-29 2 views
0

Я пытаюсь вызвать простой Си ++ от Swift, но я получаю ошибку Apple, Mach-O компоновщика:Linker ошибка при попытке вызова C++ код из Swift

Error

Error 2

Мой Sample.h файл (C++):

#if __cplusplus 
extern "C" { 
#endif 

    int getOne(); 

#ifdef __cplusplus 
} 
#endif 

Мой Sample.cpp файл:

#include <stdio.h> 

int getOne() 
{ 
    return 1; 
} 

Мой моста заголовок:

#include "Sample.h" 

Я пытаюсь вызвать функцию так просто, как:

println(getOne()) 

Примечания:

Я добавить T он библиотеки C++ для проекта и библиотек сборки (фазы сборки), я пробовал этот код с Xcode 6.2 (Swift 1.1) и с Xcode 6.3 (beta Swift 1.2) и с теми же ошибками.

Я добавил заголовок моста в настройки сборки.

Я прочитал что-то об упаковке моего кода на C++ в Obj-c, но я не совсем смог это сделать.

Любая помощь приветствуется.

+0

* Объявление * отмечено «extern» C «', но не * определение *. –

ответ

4

Как уже указано в комментарии, ошибка заключается в том, что только декларация функции отмечена extern «C», но не определение.

Так при компиляции исходного файла Swift, компилятор создает ссылку на символ «_getOne», но при компиляции «Sample.cpp», C++ подогнаны символ «__Z6getOnev» определяется. Поэтому связь сбой программы.

Решение состоит в том, чтобы включать в себя «Sample.h» от «Sample.cpp»:

#include <stdio.h> 
#include "Sample.h" 

int getOne() 
{ 
    return 1; 
} 

так что extern "C" связь-спецификация применяется для определения функции, а также.

Обычно рекомендуется включать файл .h из соответствующего файла .c/.cpp/.m, чтобы гарантировать, что реализация соответствует общедоступному интерфейсу.

+0

спасибо !!!!!!! –

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