gpt4 book ai didi

c++ - 在 iOS 应用程序中链接静态库后架构 arm64 的 undefined symbol

转载 作者:行者123 更新时间:2023-12-01 13:47:54 30 4
gpt4 key购买 nike

我正在创建一个示例静态库以在我的 iOS 应用程序中使用,但是,在调用静态库的方法时,我遇到了链接器错误:

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)
这是静态库的结构:
我有一个头文件 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;
}
正如您所看到的,它是一个非常简单的静态库,但我无法弄清楚为什么会发生此链接器错误,我在应用程序的构建阶段的“链接二进制文件与库”中添加了静态库。
这是 的截图应用程序的文件:
enter image description here
并且build设置中的搜索路径配置也是正确的,我相信:
enter image description here
这是 的一些build设置的屏幕截图静态库项目
构建阶段:
enter image description here
架构:
enter image description here
非常感谢。

最佳答案

问题是你的 doMath函数被编译为 C++ 代码,这意味着函数名会被 C++ 编译器修改。您的 Test.m然而,文件被 (Objective-)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 问题和已接受的答案: Combining C++ and C - how does #ifdef __cplusplus work?

关于c++ - 在 iOS 应用程序中链接静态库后架构 arm64 的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62821795/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com