Pergunta

Como posso adicionar biblioteca externa em um projeto construído pelo Qt Creator RC1 (versão 0.9.2)? Por exemplo, a função win32 EnumProcesses() requer Psapi.lib a ser adicionado no projeto de construção.

Foi útil?

Solução

A maneira correta de fazer isso é assim:

LIBS += -L/path/to -lpsapi

Desta forma, ele irá funcionar em todas as plataformas suportadas pelo Qt. A idéia é que você tem que separar o diretório a partir do nome da biblioteca (sem a extensão e sem qualquer 'lib' prefixo). Claro, se você estiver incluindo um lib específico do Windows, isso realmente não importa.

No caso de você deseja armazenar seus arquivos lib no diretório do projeto, você pode referenciá-los com a variável $$_PRO_FILE_PWD_, por exemplo:.

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi

Outras dicas

Você está usando projetos qmake? Se assim for, você pode adicionar uma biblioteca externa usando o LIBS variável. Por exemplo:

win32:LIBS += path/to/Psapi.lib

LIBS + = C: \ Program Files \ OpenCV \ lib

não vai funcionar porque você está usando espaços em branco em Arquivos de Programas. Neste caso, você tem que adicionar aspas, então o resultado será parecido com este: LIBS + = "C: \ Program Files \ OpenCV \ lib" . Eu recomendo colocar bibliotecas em locais não-espaço em branco; -)

O erro que você quer dizer é devido à falta de caminho de inclusão adicional. Tente adicionar-lo com: IncludePath + = C: \ path \ to \ include \ Files \ Espero que funcione. Cumprimentos.

E para adicionar vários arquivos de biblioteca que você pode escrever como abaixo:

IncludePath * = E: / DebugLibrary / VTK E: / DebugLibrary / VTK / Comum E: / DebugLibrary / VTK / Filtering E: / DebugLibrary / VTK / GenericFiltering E: / DebugLibrary / VTK / Gráficos E: / DebugLibrary / VTK / GUISupport / Qt E: / DebugLibrary / VTK / E Híbrido: / DebugLibrary / VTK / Imagem E: / DebugLibrary / VTK / IO E: / DebugLibrary / VTK / Paralela E: / DebugLibrary / VTK / Rendering E: / DebugLibrary / VTK / Utilitários E: / DebugLibrary / VTK / VolumeRendering E: / DebugLibrary / VTK / Widgets E: / DebugLibrary / VTK / Wrapping

LIBS * = OE: / DebugLibrary / VTKBin / bin / liberar -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkexpat -lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering

Se você deseja implantar sua aplicação em máquinas de clientes, em vez de usar a sua aplicação apenas a si mesmo, nós achamos que o método LIBS+= -Lxxx -lyyy pode levar a confusão, se não problemas.

Nós desenvolver aplicativos para Linux, Mac e Windows usando Qt. Nós enviamos aplicações completas, independentes. Assim, todas as bibliotecas não são do sistema deve ser incluído no pacote de implementação. Queremos que nossos clientes para ser capaz de executar o aplicativo a partir do mesmo stick USB para todos os sistemas operacionais. Por razões de compatibilidade com a plataforma do stick USB deve ser formatado como FAT32, que não suporta links simbólicos (Linux).

Nós encontramos o idioma LIBS+= -Lxxx -lyyy muito de uma caixa preta:

  1. Nós não sabemos exatamente o que o filepath é do (estático ou dinâmico) biblioteca que foi encontrado pelo vinculador. Isso é inconveniente. Nosso Mac vinculador encontrado regularmente libs diferentes dos que pensávamos que devem ser usados. Isso aconteceu várias vezes com bibliotecas OpenSSL onde o vinculador Mac encontrado e utilizado o seu próprio - mais antiga e incompatível -. Versão OpenSSL em vez de nossa versão solicitado

  2. Nós não podemos ter recursos para que os usos vinculador links simbólicos para bibliotecas como isso iria quebrar o pacote de implementação.

  3. Queremos ver a partir do nome da biblioteca quer vincular um estático ou uma biblioteca dinâmica.

Assim, para nosso caso particular, usamos apenas filepaths absolutos e verificar se eles existem. Nós remover todos os links simbólicos.

Primeiro vamos descobrir Qual sistema operacional que está usando e colocar isso na variável CONFIG. E, por exemplo, para Linux de 64 bits, então:

linux64 {
    LIBSSL= $$OPENSSLPATH/linux64/lib/libssl.a
    !exists($$LIBSSL): error ("Not existing $$LIBSSL")
    LIBS+= $$LIBSSL
    LIBCRYPTO= $$OPENSSLPATH/linux64/lib/libcrypto.a
    !exists($$LIBCRYPTO): error ("Not existing $$LIBCRYPTO")
    LIBS+= $$LIBCRYPTO
}

Todas as dependências podem ser copiados para pacote de implantação como sabemos seus filepaths.

Eu gostaria de adicionar em prol da integralidade que você também pode adicionar apenas o caminho da biblioteca, onde ele vai olhar para uma biblioteca dependentes (que não podem ser diretamente referenciada no seu código, mas uma biblioteca que você usa pode precisar dele).

Para efeito de comparação, isto corresponderia a que ambiente LIBPATH faz, mas seu tipo de obscura em Qt Creator e não bem documentada.

A forma como eu vim de contornar isso é seguinte:

LIBS += -L"$$_PRO_FILE_PWD_/Path_to_Psapi_lib/"

Essencialmente, se você não fornecer o nome da biblioteca real, ele adiciona o caminho para onde ele irá procurar bibliotecas dependentes. A diferença de sintaxe é pequeno, mas é muito útil para fornecer apenas o PATH onde procurar bibliotecas dependentes. Ele algum é apenas uma dor de fornecer cada biblioteca indivíduo caminho onde você sabe que eles estão todos em determinada pasta e Qt Creator irá buscá-las.

em .pro: LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib

em .h / .cpp: #pragma comment(lib,"user32.lib")

#pragma comment(lib,"psapi.lib")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top