Tendo problemas para vincular uma biblioteca estática C++
Pergunta
Eu descobri como configurar o VC++ para compilar o código em um arquivo .lib em vez de um .exe, mas estou tendo problemas para fazer com que uma lib seja vinculada a meus outros arquivos .obj.
Veja como configuro a biblioteca e as pastas do aplicativo.(não tenho certeza se isso está certo)
AppFolder
App.sln
App.ncb
*.h
*.cpp
Debug
*.obj
App.exe
e em algum outro lugar no disco rígido ...
LibraryFolder
lib
Library.lib
include
LibrarySolutionFolder
Library.sln
Library.ncb
*.h
*.cpp
Debug
*.obj
Library.lib
#Incluí os arquivos da biblioteca *.h dos arquivos cpp do meu aplicativo e tudo compila bem.É apenas quando vincula uma lista de todos os arquivos .lib que estão sendo pesquisados, e a biblioteca.lib não está lá, mesmo que eu o tenha listado nos diretórios VC ++.Como posso fazer com que isso seja vinculado?(E estou estruturando as pastas da biblioteca corretamente?)
Solução
Nas propriedades do projeto:
Propriedades de configuração -> Linker -> Entrada -> Dependências adicionais
Adicione lá.
Ou, no seu arquivo .h para a biblioteca, adicione:
#pragma comment(lib, "Library")
Isso fará isso automaticamente para você.
Outras dicas
Os diretórios VC++ são a lista de locais de diretório a serem pesquisados durante a vinculação.Não é uma lista de bibliotecas a serem vinculadas.
Você precisa adicionar o arquivo lib ao Dependências Adicionais campo do Vinculador de projeto configurações.
Para vincular uma biblioteca, você pode:
- Liste-o em Project-> Propriedades ...-> Linker, Input-> Dependências adicionais (os diretórios VC ++ apenas permitem usar apenas o nome .lib, em vez do caminho completo),
- Adicione o projeto da biblioteca ao seu aplicativo. Solução (na solução, clique com o botão direito do mouse -> Adicionar -> Projeto existente ...) e, em seguida, use o projeto -> dependências do projeto ... e verifique seu projeto de biblioteca (verifique se o projeto do aplicativo está selecionado no suspensão). Este é provavelmente o melhor caminho a percorrer se você estiver editando os dois projetos, pois o VC ++ reconstruirá a biblioteca se ele mudou antes de criar seu aplicativo.
Se você tem certeza de que usará apenas VC ++,
#pragma comment(lib,"C:\\path\\to\\library.lib")`
(Obrigado @nils)
NB: Parece muito estranho ter sua pasta de solução de biblioteca dentro de um diretório 'incluir': que são realmente destinados a *.h (ou outro #include
D arquivos).
Da linha de comando:
cl /ehsc {objfiles}+ /link /libpath: LibraryFolder Library.lib
Onde {objfiles}+ significa um ou mais arquivos de objeto ou CPP.
O VC não vincula simplesmente a biblioteca se você incluir o arquivo de cabeçalho.
Você deve dizer ao vinculador para usar a biblioteca. Por boas razões: você Alredy tem milhares de LIBs em sua pasta da biblioteca. Se o MSVC tivesse que pesquisar todos eles cada vez que vincular seu programa, ele teria que percorrer hundrets de megabytes de dados.
Isso levaria um bom tempo, portanto, não é feito por padrão.
Para o VC, você também pode dar uma dica ao vinculador dentro da sua fonte. Para isso, você adiciona a seguinte linha em algum lugar do seu código de origem (o cabeçalho da lib pode ser um bom lugar).
#pragma comment(lib,"c:\\path_to_library\\libname.lib")
Isso não é a plataforma independente, mas a maneira mais conveniente de obter um LIB ligado automaticamente a um projeto usando o MSVC.
Outra maneira é simplesmente adicionar o vinculador às configurações do projeto. As informações relevantes podem ser encontradas nas configurações do linker do seu projeto. Não se esqueça de adicionar a lib às configurações de liberação e depuração.