Cocoapods link_with XCTest gera erros de símbolos duplicados
-
20-12-2019 - |
Pergunta
Eu tenho esse projeto principal que irá gerar uma biblioteca estática (chame-a MySDK
).Eu tenho um componente (chame-o Analytics
) como um cocoapod privado.
Então acabo com uma estrutura de arquivos como esta:
+ MySDK
- src
+ Pods
+ Pods
- Analytics
Cada projeto tem seus próprios testes, mas agora preciso fazer alguns testes de integração, então no meu Podfile eu uso link_with
, mas sempre que faço isso não consigo nem executar os testes originais porque recebo um monte de duplicate symbol
erros:
duplicate symbol _OBJC_METACLASS_$_PodsDummy_Pods in:
/.../DerivedData/Build/Products/Release-iphonesimulator/libPods.a(Pods-dummy.o)
/.../DerivedData/Build/Products/Release-iphonesimulator/libMySDK.a(Pods-dummy.o)
...
duplicate symbol _MYPREFIXFileTableIDColumnName in:
/.../DerivedData/Build/Products/Release-iphonesimulator/libPods.a(MYPREFIXDatabaseConstants.o)
/.../Build/Products/Release-iphonesimulator/libMySDK.a(MYPREFIXDatabaseConstants.o)
Todos os erros vêm do meu Analytics
componente.Todos os arquivos que causam um problema têm Funções C (estou lidando diretamente com sqlite) e/ou (global) constantes, ou eles são categorias, mas eles são todos prefixados.
Meu Podfile
se parece com isso:
platform :ios, '7.0'
link_with ['MySDK', 'MySDKTests']
pod 'Analytics', '0.0.1'
Meu podscpec para Analytics
se parece com isso:
Pod::Spec.new do |s|
s.name = 'Analytics'
s.version = '0.0.1'
s.platform = :ios
s.summary = "Analytics utility"
s.homepage = 'http://google.com'
s.author = { 'Me' => 'me@me.com' }
s.source = { :git => 'https://github.com/Company/Analytics.git', :tag => '0.0.1' }
s.source_files = 'Analytics/**/*.{h,m}'
s.requires_arc = true
s.ios.deployment_target = '6.0'
end
Existe uma razão pela qual estou recebendo esses erros?Devo compilar esses arquivos como não-arco ou usar algum sinalizador especial?
Alguma ideia
Solução
Eu finalmente consegui que isso funcione!
Eu não deveria ter vinculado meus pods a MySDKTests
, já que o produto final (MySDK
, uma biblioteca, já estava vinculada a Analytics
).
No entanto, adicionei o seguinte ao meu podspec
arquivo:
s.public_header_files = 'Analytics/**/*.h'
s.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$(SRCROOT)/Pods/Headers/Analytics"' }
A segunda linha não é realmente necessária porque não está modificando meu MySDKTests
alvo.eu tive que adicionar HEADER_SEARCH_PATHS
para o meu MyDSKTests
para disponibilizar esses cabeçalhos para os testes.
Eu li que algumas pessoas usam com sucesso LIBRARY_SEARCH_PATHS
em vez disso, mas isso não funcionou para mim.Se alguém quiser explicar o porquê, seria ótimo, mas por enquanto deixarei minha solução aqui para outras pessoas, caso encontrem problemas semelhantes.
Ver essa outra pergunta para informações relacionadas