我正在开发一个在 Xcode 中混合了 Objective C 和 C++ 的静态库A,我遇到了“弱链接”另一个静态库的需要,我们称之为B。A调用B中定义的一些方法。这个想法是,如果B没有链接/提供,A将不会抛出任何未定义的符号错误。我知道在Objective C中你可以做到这一点,在代码中我可以依靠运行时方法,如NSClassFromString或[someObject Class]来检查某个函数是否存在/是否可从另一个静态库中获得,但我不知道是否我可以在我的一个 .cpp 源文件中实现这一点。请指教,谢谢!
为了说明目的,我创建了一个非常简单的示例项目:
图书馆A:
Core_ObjC.h,这是要暴露的头文件
#import <Foundation/Foundation.h>
@interface Core_Objc : NSObject
-(int) calculate;
@end
Core_ObjC.mm
#import "Core_ObjC.h"
#include "Core_CPP.h"
@implementation Core_Objc
-(int) calculate{
return calculate_Core();//Call into cpp here
}
@end
Core_CPP.cpp
#include "Core_CPP.h"
#include "NonCore_CPP.h"
int calculate_Core(){
return calculate_NonCore();//Call into another cpp here but it's defined in Library B
}
图书馆B:
NonCore_CPP.cpp
#include "NonCore_CPP.h"
int calculate_NonCore(){
return 100;
}
如果我在示例应用程序中链接这两个库,则该应用程序将正常编译。但是,当我从示例应用程序中仅链接 A 时,我会遇到如下错误:
Undefined symbols for architecture arm64:
"calculate_NonCore()", referenced from:
calculate_Core() in CoreFramework(Core_CPP.o)
该错误对我来说确实有意义,因为B将缺少定义,但我只是在寻找一个解决方案,当只有A时编译不会抱怨。