Pergunta

Em C ++, biblioteca estática A está ligado em bibliotecas dinâmico B e C. Se uma classe, Foo, é usado em A, que é definida em B, ligará C se ele não usa Foo?

Eu pensei que a resposta foi sim, mas agora eu estou correndo em um problema com xlc_r7 onde biblioteca C diz Foo é um símbolo indefinido, que é tão longe como C está em causa. Meu problema é que com a biblioteca C não está usando a classe referenciando-lo. Este links em Win32 (VC6) e OpenVMS.

Esta é uma discrepância vinculador ou um PBCAK?

New informações:

  1. B depende de C, mas não vice-versa.

  2. Eu não estou usando / OPT: REF a ligação no Windows e que liga sem problema.

Foi útil?

Solução

Quando você link estaticamente, dois módulos de se tornar um. Então, quando você compilar C e vincular um para ele, é como se você tinha copiado todo o código fonte de um para o código fonte de C, em seguida, compilado a fonte combinado. Então C.dll inclui A, que tem uma dependência em B via Foo. Você precisará de ligação C a biblioteca de ligação do B, a fim de satisfazer essa dependência.

Note-se que de acordo com suas informações, isso vai criar uma dependência circular entre B e C.

Outras dicas

Parece que é provavelmente o ligador (ld / unix), como (a maioria das versões que eu usei de) ld liga as bibliotecas da esquerda para a direita - e se há uma referência no primeiro que é exigido por um posterior o truque habitual é acrescentar a primeira biblioteca (ou qualquer biblioteca necessário) para o final do comando.

É um tentar e ver ....

é sua linha de ligação para C incluindo o lib de exportação para B? Se sim, então como Richard sugerem que soa como uma coisa ordenação.

Outra sugestão é para ver se há uma opção de vinculador para ignorar símbolos sem referência, se C não precisa que a funcionalidade de A. Para o Microsoft vinculador este alcançado com o / OPT:. Interruptor REF

A única razão pela qual C não teria ligação é que o compilador acha que não precisa o símbolo Foo.

Uma vez que C não se refere a símbolos Foo, tem que haver outra razão pela qual o ligador precisa o símbolo.

A única outra razão que eu saiba, é uma exportação de algum tipo. Só sei de Visual C ++, então eu sugiro que você procurar algum equivalente de __declspec( dllexport ) nos arquivos pré-processados, e ver o que o gera.

Aqui está o que eu faria: ter a saída pré-processador armazenado em um arquivo separado e busca-lo por ocorrências de Foo. Ou ele irá ocorrer como uma exportação, ou que tenha sido referenciada alguma forma pelo compilador.

Se a definição de função específica não é necessário, em seguida, que a biblioteca não será ligada durante a ligação de fase. No seu caso, como a definição de foo está presente na biblioteca B e não na biblioteca de C. Assim, a biblioteca C não será carregado para a memória o carregamento do executável.

Mas ao que parece, você está usando a função foo () na biblioteca C, bem como, por causa do que você está recebendo o erro correspondente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top