Compilando biblioteca C ++ externa para uso com o projeto iOS
Eu sou completamente novo no uso de bibliotecas C ++, então aprecio que isso possa ser um pouco específico para o meu caso (informe-me e posso fornecer mais detalhes).
Eu tenho uma biblioteca C ++ externa que estou tentando usar com um projeto iOS. A biblioteca segue um padrão de configuração para configurar, criar, criar para gerar um arquivo de biblioteca .a. Quando tento adicionar este arquivo de biblioteca ao Xcode, recebo o seguinte erro:
ignorando o arquivo /Users/Developer/iOS/TestProj/libpresage.a, o arquivo foi criado para o arquivo morto que não é a arquitetura que está sendo vinculada (i386):
/Users/Developer/iOS/TestProj/libpresage.a
Baseado emessa questão, Tentei transformar o Build Active Architecture Only como NO e recebo o mesmo erro. Isso me faz suspeitar que compilei a biblioteca para a arquitetura incorreta.
A execução de lipo -info no arquivo .a fornece:
arquivo de entrada libpresage.a não é um arquivo gordo Arquivo não gordo: libpresage.a
é arquitetura: x86_64
Como não são armv7s, armv7 ou arm64, tento compilar a biblioteca C ++ novamente com os seguintes parâmetros:
1) Experimentar
./configure CC="gcc -arch armv7s" \
CXX="g++ -arch armv7s" \
CPP="gcc -E" CXXCPP="g++ -E"
Erro na compilação, recebo:
ld: library not found for -lcrt1.3.1.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
2) Experimentar
./configure CC="gcc -arch arm64" \
CXX="g++ -arch arm64" \
CPP="gcc -E" CXXCPP="g++ -E"
Erro na compilação, recebo:
ld: warning: ld: warning: ignoring file /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libSystem.dylib, faltando a arquitetura necessária arm64 em arquivo /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libSystem.dylib (2 fatias) ignorando o arquivo /Applications/Xcode.app/Contents/ Developer / Platforms / MacOSX.platform / Developer / SDKs / MacOSX10.10.sdk / usr / lib / libstdc ++. Dylib, falta da arquitetura arm64 necessária no arquivo /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer /SDKs/MacOSX10.10.sdk/usr/lib/libstdc++.dylib (2 fatias)
ld: os principais executáveis dinâmicos devem vincular-se ao libSystem.dylib para a arquitetura arm64 clang: error: o linker falhou com o código de saída 1 (use -v para ver a chamada)
Existe algo óbvio que estou perdendo?
EDITAR:
Obrigado pelas respostas, então eu consegui colocar a biblioteca no Xcode como um destino de construção personalizado, apontando o comando 'make' para as bibliotecas MakeFile. Esta compilação bem.
Meus passos a partir daqui:
Adicione uma dependência do meu destino de aplicativo iOS do Objective C ao destino de compilação personalizado.Faça referência à biblioteca e crie um wrapper Objective C ++.Isso parece bom até que eu precise chamar a biblioteca C ++ externa, e recebo o erro ao compilar:Símbolos indefinidos para a arquitetura armv7: "Presage :: Presage (PresageCallback *)", referenciada em: - [PresageBridge init] em PresageBridge.o "Presage :: ~ Presage ()", referenciada em: - [PresageBridge init] em PresageBridge. o ld: símbolo (s) não encontrado (s) para a arquitetura armv7 clang: erro: o comando do vinculador falhou com o código de saída 1 (use -v para ver a chamada)
Meu wrapper C ++ objetivo (vinculando o cabeçalho externo da biblioteca C ++ presage.h):
#import "PresageBridge.h"
#include "presage.h"
@implementation PresageBridge
- (instancetype)init
{
if(self = [super init])
{
Presage hello(&callback);
}
return self;
}
Com base no código acima, não parece que estou perdendo o cabeçalho, e o interessante é que também tentei criar uma instância de outras classes na biblioteca externa e elas parecem estar funcionando, o que sugere que o Xcode pode vincule presage.h corretamente por algum motivo.