Adicionando biblioteca externa ao projeto Qt Creator

112

Como posso adicionar uma biblioteca externa em um projeto construído pelo Qt Creator RC1 (versão 0.9.2)? Por exemplo, a função win32 EnumProcesses()precisa Psapi.libser adicionada ao projeto para construir.

Donotalo
fonte

Respostas:

216

A maneira correta de fazer isso é:

LIBS += -L/path/to -lpsapi

Desta forma, ele funcionará em todas as plataformas suportadas pelo Qt. A ideia é separar o diretório do nome da biblioteca (sem a extensão e sem qualquer prefixo 'lib'). Claro, se você está incluindo uma biblioteca específica do Windows, isso realmente não importa.

Caso queira armazenar seus arquivos lib no diretório do projeto, você pode referenciá-los com a $$_PRO_FILE_PWD_variável, por exemplo:

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi
Tamás Szelei
fonte
2
É possível especificar uma variável de ambiente como um caminho de biblioteca? Estou perguntando porque escrever nomes de caminho codificados no arquivo .pro quebraria as coisas se um projeto fosse desenvolvido por várias pessoas que podem não ter todas as bibliotecas instaladas nos mesmos locais.
antred
Isso funcionou para mim, mas quando eu gerei um projeto vs com qmake -tp vc, não encontro nomes de libs no Additional Dependenciesprojeto, mas o projeto vs funciona bem. Isso significa que existem outros métodos para adicionar Additional Dependenciesno vs?
Summer Sun
1
Não acho que você precise especificar um caminho para uma biblioteca interna do Windows. Nossos arquivos .pro têm linhas como este na seção win32: LIBS += -lGdi32.
Dan Korn
1
Como @DanKorn observou, para bibliotecas integradas do Windows, você não precisa (e não deve) especificar um caminho.
bur
Por que eles não podem simplesmente fazer uma GUI para adicionar um smh de biblioteca.
GeneCode
24

Você está usando qmakeprojetos? Nesse caso, você pode adicionar uma biblioteca externa usando a LIBSvariável. Por exemplo:

win32:LIBS += path/to/Psapi.lib
diretamente
fonte
1
Desculpe pela pergunta esfarrapada, mas a biblioteca psapi já deve estar pré-construída ou o QtCreator se encarregará de compilá-la?
Dfr
11

LIBS + = C: \ Arquivos de programas \ OpenCV \ lib

não funcionará porque você está usando espaços em branco em arquivos de programa. Neste caso, você deve adicionar aspas, então o resultado ficará assim: LIBS + = "C: \ Arquivos de Programas \ OpenCV \ lib" . Eu recomendo colocar bibliotecas em locais que não sejam de espaço em branco ;-)

Martin
fonte
As versões mais recentes do Qt (Criador) sempre querem (simples) barras como separadores de diretório. A única exceção é quando você usa o comando "sistema" no Windows. Em seguida, você precisa alimentar o sistema com uma barra invertida escapada, ou seja, duas barras invertidas. Para substituir todas as barras com duas barras invertidas pode ser feito da seguinte forma: WINDIR = $$DIR,WINDIR ~=s,/,\\,g
adlag
6

O erro que você quis dizer é devido à falta de um caminho de inclusão adicional. Tente adicioná-lo com: INCLUDEPATH + = C: \ path \ to \ include \ files \ Espero que funcione. Saudações.


fonte
4

E para adicionar vários arquivos de biblioteca, você pode escrever como a seguir:

INCLUDEPATH * = E: / DebugLibrary / VTK E: / DebugLibrary / VTK / Common E: / DebugLibrary / VTK / Filtering E: / DebugLibrary / VTK / GenericFiltering E: / DebugLibrary / VTK / Graphics E: / DebugLibrary / VTK / GUISupport / Qt E: / DebugLibrary / VTK / Hybrid E: / DebugLibrary / VTK / Imaging E: / DebugLibrary / VTK / IO E: / DebugLibrary / VTK / Parallel E: / DebugLibrary / VTK / Rendering E: / DebugLibrary / VTK / Utilities E : / DebugLibrary / VTK / VolumeRendering E: / DebugLibrary / VTK / Widgets E: / DebugLibrary / VTK / Wrapping

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

QT-ITK-VTK-Help
fonte
3

Se você deseja implantar seu aplicativo em máquinas de clientes, ao invés de usar seu aplicativo apenas você mesmo, descobrimos que o LIBS+= -Lxxx -lyyymétodo pode causar confusão, se não problemas.

Desenvolvemos aplicativos para Linux, Mac e Windows usando Qt. Nós enviamos aplicativos autônomos completos. Portanto, todas as bibliotecas que não são do sistema devem ser incluídas no pacote de implantação. Queremos que nossos clientes possam executar o aplicativo a partir do mesmo pen drive para todos os sistemas operacionais. Por razões de compatibilidade de plataforma, o stick USB deve ser formatado como FAT32, que não oferece suporte a links simbólicos (Linux).

Achamos o LIBS+= -Lxxx -lyyyidioma muito de uma caixa preta:

  1. Não sabemos exatamente qual é o caminho do arquivo da biblioteca (estática ou dinâmica) que foi encontrada pelo vinculador. Isso é inconveniente. Nosso vinculador Mac regularmente encontrava libs diferentes daquelas que pensamos que deveriam ser usadas. Isso aconteceu várias vezes com bibliotecas OpenSSL onde o vinculador do Mac encontrou e usou sua própria versão - mais antiga, incompatível - do OpenSSL em vez da versão solicitada.

  2. Não podemos permitir que o vinculador use links simbólicos para bibliotecas, pois isso quebraria o pacote de implantação.

  3. Queremos ver a partir do nome da biblioteca se vinculamos uma biblioteca estática ou dinâmica.

Portanto, para nosso caso particular, usamos apenas caminhos de arquivo absolutos e verificamos se eles existem. Removemos todos os links simbólicos.

Primeiro, descobrimos qual sistema operacional estamos usando e colocamos na variável CONFIG. E, por exemplo, para Linux 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 copiadas no pacote de implantação, pois conhecemos seus caminhos de arquivo.

adlag
fonte
1

Gostaria de adicionar, para fins de integridade, que você também pode adicionar apenas o PATH DA BIBLIOTECA onde procurará por uma biblioteca dependente (que pode não estar diretamente referenciada em seu código, mas uma biblioteca que você usa pode precisar dela).

Para comparação, isso corresponderia ao que o ambiente LIBPATH faz, mas é meio obscuro no Qt Creator e não está bem documentado.

A forma como resolvi isso é a seguinte:

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

Essencialmente, se você não fornecer o nome real da biblioteca, ele adiciona o caminho para onde pesquisará as bibliotecas dependentes. A diferença na sintaxe é pequena, mas isso é muito útil para fornecer apenas o PATH onde procurar por bibliotecas dependentes. Às vezes é apenas uma dor fornecer cada biblioteca individual de caminho onde você sabe que todos eles estão em uma determinada pasta e o Qt Creator irá buscá-los.

zar
fonte
0

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

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

#pragma comment(lib,"psapi.lib")
Dnyaneshwar
fonte