it-swarm-pt.tech

A configuração de compilação personalizada do Xcode causa "biblioteca / arquivo não encontrado" para bibliotecas estáticas

Eu tenho um espaço de trabalho com um projeto que se vincula às bibliotecas estáticas em outro projeto (que também está no espaço de trabalho). É um problema em Kobold2D Não consegui resolver, apesar de entender a causa, e suponho que seja semelhante a esta pergunta .

Os destinos do projeto e da biblioteca estática têm todos os Depuração e Versão construir configurações. Tudo está bem.

Agora alguém adiciona uma nova configuração de compilação no projeto e a denomina Ad-Hoc por exemplo. Agora, o destino do projeto cria a configuração Ad-Hoc , no entanto, as bibliotecas estáticas não têm essa configuração. Aparentemente, eles padronizam a construção da configuração de liberação .

No final, quando o vinculador deve reunir tudo, ele falha:

ld: library not found for -lbox2d-ios
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang++ failed with exit code 1

Para bibliotecas carregadas à força via -force_load $(BUILT_PRODUCTS_DIR)/libSomeLib.a, o erro é semelhante, mas diz "arquivo não encontrado". Devo observar que a biblioteca "libbox2d-ios.a" está na lista de fases de construção "link binary with libraries".

Obviamente, o problema é que o vinculador está assumindo que as bibliotecas estão na pasta Ad-Hoc-iphoneos na BUILT_PRODUCTS_DIR enquanto estão na Release-iphoneos pasta porque eles não têm Ad-Hoc configuração de compilação.

Como posso dar um tapa na cara do vinculador e dizer a ele para colocar as bibliotecas onde estão? De preferência, estou procurando uma solução que funcione para os dois casos, ou seja, as bibliotecas adicionaram a maneira padrão (fase de criação de bibliotecas de vínculo binário com bibliotecas) e bibliotecas que precisam de uma força-load_load adicional para funcionar.

Espero que haja alguma maneira de:

  • forçar bibliotecas a serem colocadas na pasta de configuração de construção do destino do aplicativo
  • execute um script de pós-compilação e pré-link que copie cada biblioteca para a pasta de configuração de compilação
  • especifique um caminho relativo para as bibliotecas
  • use uma macro diferente que não seja $ BUILT_PRODUCTS_DIR para -force_load
  • um sinalizador de vinculador como -WTFmake-all-problems-go-away

Com licença, mas tenho que dizer isso… ARGH! :)

43
LearnCocos2D

Infelizmente, não encontrei uma maneira de fazer isso. A melhor solução alternativa que posso encontrar é adicionar novos destinos em vez de novas configurações de compilação. Por exemplo, em um dos meus projetos, tenho apenas configurações de Liberação e Depuração, mas tenho destinos extras chamados "MyProject - app store" e "MyProject - ad hoc". Isso só será possível se você tiver o controle do arquivo do projeto, é claro.

Ter alvos duplicados por perto é irritante ao extremo, porque você pode adicionar arquivos a um destino e esquecer de adicioná-los aos outros, e você não saberá até tentar construí-lo. Mas ele cria, o que é uma vitória (com o xcode de qualquer maneira).

Uma pergunta semelhante que fiz há um tempo atrás: Qual é a maneira correta de definir configurações de compilação em um projeto ios usando bibliotecas estáticas para criar um arquivo no xcode 4?

6
Daniel

Como dito na pergunta semelhante Biblioteca estática do iOS como um subprojeto de um projeto que possui configurações de compilação personalizadas? , a correção é adicionar esta linha

$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

para o seu alvo Framework Search Paths, Header Search Paths e/ou Library Search Paths

31
ULazdins

Aqui está algo que funciona para mim.

No projeto com a configuração de compilação Adhoc, substitua o "Caminho dos produtos de compilação por configuração" (CONFIGURATION_BUILD_DIR) e "Caminho intermediário dos arquivos de compilação por configuração" (CONFIGURATION_TEMP_DIR) da configuração de compilação Adhoc para usar a mesma pasta que a configuração da versão.

Adhoc: CONFIGURATION_BUILD_DIR = $(SYMROOT)/Release$(EFFECTIVE_PLATFORM_NAME)
Adhoc: CONFIGURATION_TEMP_DIR = $(PROJECT_TEMP_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

Agora, quando você faz uma compilação Adhoc, o Xcode coloca libFoo.a e Bar.app na pasta Release-iphoneos. O vinculador ficará satisfeito e você poderá usar -force_load $ (BUILT_PRODUCTS_DIR) /libFoo.a como de costume.

Como alternativa, você pode adicionar a pasta Release-iphoneos aos caminhos de pesquisa da biblioteca para a configuração de compilação Adhoc:

Adhoc: LIBRARY_SEARCH_PATHS = $(inherited) $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

Mas você precisará definir um -force_load diferente para cada configuração de compilação:

Debug: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a
Adhoc: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
Release: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a
20
lukelutman

Eu tenho um problema semelhante usando o CocoaPods e tentando ter mais de uma configuração Adhoc (ou Enterprise ou Beta).

Aqui está o que parece funcionar (digamos que ambos os projetos estejam no mesmo xcworkspace):

  • Adicione a lib gerada subproject ao mainproject Link Binary with Libraries.

  • Como a configuração Adhoc não é conhecida pelo subproject, o Xcode usará a configuração Release como um fallback (ou talvez a primeira configuração da lista) ao construí-la.

  • O vinculador reclamará porque não consegue encontrar a lib ... ok, vamos lidar com esta.

  • Adicione uma fase de criação de Script de Execução ao mainproject, logo após a fase de Dependências de Destino. Digite este script:

if [ "$CONFIGURATION" = "Adhoc" ]; then
    echo "====================================="
    echo "Copying libPods Release into the Adhoc product build dir!"
    echo "====================================="
    cp "$BUILT_PRODUCTS_DIR/../Release-$PLATFORM_NAME/libPods.a" "$BUILT_PRODUCTS_DIR"
else
    echo "No manual lib copy."
fi

Isso copiará a lib gerada pela compilação subprojectRelease (que acontecerá quando mainproject for criada) no diretório Adhoc build, para que o vinculador encontrará a lib. E devemos estar prontos para ir! sim!

7
MonsieurDart

Minha estrutura é criada usando outro projeto SDK dentro do meu projeto de aplicativo. Primeiro eu tenho um "Debug" e "Release", então eu adiciono uma nova "TestFlight" configuração. Não consigo arquivar com esse novo. Acabei adicionando uma nova configuração de compilação com o mesmo nome no projeto SDK. Em outras palavras, acabei adicionando a configuração "TestFlight" a AMBOS meus projetos de aplicativo e SDK. Agora o arquivo funciona.

Não tenho certeza se é a melhor maneira de fazê-lo. Mas parece limpo o suficiente para mim por enquanto. :)

Ah, e para Cocoapods, depois de duplicar a configuração, se você executar pod install imediatamente você receberá este aviso amarelo:

[!] CocoaPods não definiu a configuração base do seu projeto porque seu projeto já possui um conjunto de configurações personalizadas. Para que a integração do CocoaPods funcione, defina as configurações básicas do destino ...

Você deve acessar a seção Projeto, guia "Informações", seção "Configurações", selecionar a nova configuração que você acabou de criar e definir "Liberação de Pods" de todos os destinos como "Nenhum" primeiro. Depois disso, você pode executar pod install com segurança.

4
Hlung

Normalmente eu tenho um esquema AppStore (mapeado para minha configuração de AppStore).

Uma coisa que aconteceu comigo foi esse problema que diferenciava maiúsculas de minúsculas que fazia Cocoapods gerar uma pasta de compilação para Pods.build dentro Release-iphonesimulator (como substituto) em vez de AppStore-iphonesimulator.

Acho que clicou erradamente quando vinculei o esquema e a configuração e apenas removê-lo e adicioná-lo novamente me fez entender o que deu errado. Verifique o diff.

sensitive issue

Eu estava usando cocoapods 0.38.2, portanto, essa era claramente uma configuração incorreta do usuário e não uma problema do Cocoapods resolvido em 0,34

0
Carlos Ricardo

Você pode adicionar CONFIGURATION_BUILD_DIR =/Some/Shared/Dir antes de executar o xcodebuild. Por exemplo:

cd SOURCE_DIR
xcodebuild  -workspace YourProject.xcworkspace -scheme YourScheme -configuration AdHoc -sdk iphoneos clean build CONFIGURATION_BUILD_DIR="`pwd`"/build
0
Roman Busygin

É um erro de tempo de pré-compilação para um Library ou Framework

Você está enfrentando esse problema porque o Xcode não consegue encontrar o local dos cabeçalhos públicos; basta informar ao Xcode onde eles estão adicionando o caminho certo.

Você pode ter Module not found quando:

  • você não incluiu um caminho de biblioteca para o Build Settings -> Header Search Paths
  • você não incluiu um caminho de estrutura para o Build Settings -> Framework Search Paths
0
yoAlex5