Неопределенные символы для архитектуры arm64 после связывания библиотеки stati c в приложении iOS - PullRequest
5 голосов
/ 09 июля 2020

Я создаю образец библиотеки stati c для использования в моем приложении iOS, однако при вызове методов библиотеки stati c я столкнулся с ошибкой компоновщика:

Undefined symbols for architecture arm64:
"_doMath", referenced from:
  _doMathInterface in libTestMain.a(Test.o)
 (maybe you meant: _doMathInterface)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Вот структура библиотеки stati c:

У меня есть заголовочный файл Test.h:

#import <Foundation/Foundation.h>

@interface Test : NSObject

int doMathInterface(int a, int b);

@end

и его реализация Test.m:

#import "Test.h"
#include "PaymentAPI.h"

@implementation Test

int doMathInterface(int a, int b){
    return doMath(a, b);
}

@end

и в PaymentAPI.h:

#ifndef PaymentAPI_h
#define PaymentAPI_h

int doMath(int a, int b);

#endif /* PaymentAPI_h */

Наконец, в PaymentAPI. cpp:

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

int doMath(int a, int b){
    return a + b;
}

Как видите, это очень простая библиотека stati c, но я не мог Чтобы понять, почему происходит эта ошибка компоновщика, я добавил библиотеку stati c в «Связывание двоичных файлов с библиотеками» на этапах сборки в приложении.

Вот скриншот приложения Файлы :

enter image description here

and search paths configuration in build settings is also correct, I believe:

enter image description here

Here is a screenshot of some build settings for the static library project

Build Phases: enter image description here

Architecture: введите описание изображения здесь

Большое спасибо.

Ответы [ 4 ]

1 голос
/ 15 июля 2020

Проблема в том, что ваша doMath функция компилируется как код C ++, а это означает, что имя функции искажается компилятором C ++. Однако ваш файл Test.m будет использован компилятором (Цель -) C, а C не использует изменение имени.

Это означает, что компоновщик в конечном итоге будет искать неправильный символ. Вы можете исправить это, если компилятор C ++ будет выдавать несвязанное имя функции. Для этого вам нужно будет использовать extern "C" в PaymenAPI.h следующим образом:

#ifndef PaymentAPI_h
#define PaymentAPI_h

#ifdef __cplusplus
extern "C" {
#endif

int doMath(int a, int b);

#ifdef __cplusplus
}
#endif

#endif /* PaymentAPI_h */

Для полного объяснения вы можете взглянуть на этот вопрос SO и принятый ответ: Объединение C ++ и C - как работает #ifdef __cplusplus?

0 голосов
/ 18 июля 2020

вам лучше использовать djinni, если вы хотите создавать библиотеки c stati с C ++, поскольку он будет обрабатывать функции моста, включая имена функций и символы.

0 голосов
/ 16 июля 2020

Когда вы вызываете функцию C ++ через Objective- C, вам необходимо создать класс-оболочку (файл .mm).

Пожалуйста, обратитесь по этой ссылке

0 голосов
/ 15 июля 2020

Компоновщик видит имя символа «_doMath», а не «doMath» - поэтому я думаю, что вы выполняете взаимодействие неправильно.

Я обнаружил следующее: c И вот хорошая статья, в которой объясняется, как сделать взаимодействие между C ++ и Objective C / ObjeciveC ++:

https://www.drdobbs.com/cpp/interoperating-between-c-and-objective-c/240165502

= > попробуйте переименовать ваш файл .m в .mm

...