我完全不会使用C++库,所以我明白这可能对我的情况有些具体(如果需要,让我知道我可以提供更多细节)。
我有一个外部的C++库,我正在尝试将其与iOS项目一起使用。该库遵循配置、构建、生成 .a 库文件的模式。当我尝试将此库文件添加到Xcode时,我会收到以下错误消息:
忽略文件 /Users/Developer/iOS/TestProj/libpresage.a,该文件是为未连接的体系结构(i386)而构建的归档文件:
/Users/Developer/iOS/TestProj/libpresage.a
根据这个问题,我尝试将 Build Active Architecture Only 设为“NO”,但我仍然得到相同的错误。这使我怀疑我可能已经针对错误的架构编译了库。
在 .a 文件上运行 lipo -info 命令的结果如下:
输入文件 libpresage.a 不是一个通用文件 非通用文件: libpresage.a
是体系结构: x86_64
由于它既不是 armv7s、armv7 也不是 arm64,我尝试使用以下参数重新编译 C++ 库:
1) 尝试
./configure CC="gcc -arch armv7s" \
CXX="g++ -arch armv7s" \
CPP="gcc -E" CXXCPP="g++ -E"
编译时发生错误,出现以下信息:
ld: library not found for -lcrt1.3.1.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
2) 尝试
./configure CC="gcc -arch arm64" \
CXX="g++ -arch arm64" \
CPP="gcc -E" CXXCPP="g++ -E"
编译错误,我收到以下消息:
ld: 警告:ld: 警告:忽略文件 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libSystem.dylib, 缺少所需的体系结构arm64在文件中 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libSystem.dylib (2个切片)忽略文件 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libstdc++.dylib, 缺少所需的体系结构arm64在文件中 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libstdc++.dylib (2个切片)
ld: 动态主执行文件必须链接arm64架构的libSystem.dylib文件clang: 错误:链接器命令失败退出 1(使用-v查看调用)
我是否漏掉了一些明显的东西?
编辑:
感谢回复,我已经将库作为自定义构建目标添加到Xcode中,并将“make”命令指向库的MakeFile。这个构建很好。
我的下一步:
- 将Objective C iOS应用程序目标的依赖项添加到自定义构建目标。
- 引用库并创建Objective C++包装器。
- 这似乎很好,直到我需要调用外部C++库,然后编译时出现错误:
体系结构armv7的未定义符号: “ Presage :: Presage(PresageCallback *)”,引用自: - [PresageBridge init]中的PresageBridge.o “ Presage ::〜Presage()”,引用自: - [PresageBridge init]中的PresageBridge.o ld:找不到符号(s)适用于体系结构armv7 clang:错误:链接器命令失败退出1(使用-v查看调用)
我的Objective C++包装器(链接外部C++库头文件presage.h):
#import "PresageBridge.h"
#include "presage.h"
@implementation PresageBridge
- (instancetype)init
{
if(self = [super init])
{
Presage hello(&callback);
}
return self;
}
基于上述代码,看起来我没有丢失头文件。有趣的是,我也尝试创建外部库中其他类的实例,它们似乎可以工作,这表明Xcode无法正确链接presage.h。