Forçar inclusão de arquivos de objetos de biblioteca estática que não exportam quaisquer símbolos (iPhone / GCC)

StackOverflow https://stackoverflow.com/questions/1450748

Pergunta

Estou criando uma biblioteca estática para uso em aplicações para iPhone. Ele contém uma série de arquivos de origem que exportam há símbolos, todos eles fazem é instanciar uma instância estática de uma classe que, em seguida, executa algum código em seu construtor que os registos várias coisas com uma classe gerente de centro em outro lugar. Esta tudo bem funciona quando o código é construído como parte de uma aplicação do iPhone padrão, mas quando ele é separado em uma biblioteca estática esses arquivos não torná-lo para o binário do aplicativo final e para que os construtores para as instâncias de classe privadas que contêm don 't se executar, e este problemas causas. Eu desligado todas as opções de compilação para fazer com remoção mortos e assim por diante, tanto para a construção de biblioteca estática e a compilação do aplicativo final.

Eu corri para este problema nas Metrowerks compilador há um tempo atrás, porém nesse caso estava ocorrendo mesmo quando o código foi construído em uma única aplicação sem quaisquer bibliotecas intermediários. A solução foi bastante simples: basta usar __declspec(force_export) nas instâncias de classe privadas e tudo está bem

.

Existe algum equivalente para iPhone / GCC? Eu estou usando o Xcode 3.1.4 com o GCC 4.2 e direcionamento iPhone OS 3.1. Alternativamente há alguma maneira de dizer a aplicação para ligação em cada arquivo objeto na biblioteca estática independentemente de haver ou não é explicitamente mencionada? Eu já confirmou usando ar que o conjunto completo de arquivos objeto estão fazendo-o na biblioteca estática.

Agradecemos antecipadamente.

Foi útil?

Solução

Eu acho que a opção que você está procurando é -all_load:

   -all_load
       Loads all members of static archive libraries.  See man ld(1) for
       more information.

Outras dicas

-all_load tem alguns problemas se tiver que ligar muitas bibliotecas e / ou estruturas (Mac OS X). Neste caso, você só deve forçar todos os símbolos de uma biblioteca específica usando -force_load:

g++ test.cpp -o test -force_load libtoload.a
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top