Menambahkan perpustakaan eksternal ke dalam proyek Qt Creator

112

Bagaimana cara menambahkan pustaka eksternal ke dalam proyek yang dibangun oleh Qt Creator RC1 (versi 0.9.2)? Misalnya, fungsi win32 EnumProcesses()perlu Psapi.libditambahkan dalam proyek untuk membangun.

Donotalo
sumber

Jawaban:

216

Cara yang tepat untuk melakukannya adalah seperti ini:

LIBS += -L/path/to -lpsapi

Dengan cara ini akan bekerja pada semua platform yang didukung oleh Qt. Idenya adalah Anda harus memisahkan direktori dari nama perpustakaan (tanpa ekstensi dan tanpa awalan 'lib'). Tentu saja, jika Anda termasuk lib khusus Windows, ini tidak masalah.

Jika Anda ingin menyimpan file lib di direktori proyek, Anda dapat mereferensikannya dengan $$_PRO_FILE_PWD_variabel, misalnya:

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi
Tamás Szelei
sumber
2
Apakah mungkin untuk menentukan variabel lingkungan sebagai jalur perpustakaan? Saya bertanya karena menulis nama jalur yang di-hardcode ke dalam file .pro akan merusak banyak hal jika sebuah proyek dikembangkan oleh banyak orang yang mungkin tidak menginstal semua perpustakaan di lokasi yang sama.
semut
Ini berhasil untuk saya, tetapi ketika saya membuat proyek vs dengan qmake -tp vc, saya tidak menemukan nama libs dalam Additional Dependenciesproyek tersebut, tetapi proyek vs berjalan dengan baik. Apakah itu berarti ada beberapa metode lain untuk menambahkan Additional Dependenciesvs?
Matahari Musim Panas
1
Saya tidak berpikir Anda perlu menentukan jalur untuk pustaka Windows bawaan. File .pro kami memiliki garis-garis seperti ini di bagian win32: LIBS += -lGdi32.
Dan Korn
1
Seperti yang dicatat @DanKorn, untuk pustaka Windows bawaan Anda tidak perlu (dan tidak boleh) menentukan jalur.
bur
Mengapa mereka tidak bisa membuat GUI untuk menambahkan perpustakaan smh.
GeneCode
24

Apakah Anda menggunakan qmakeproyek? Jika demikian, Anda dapat menambahkan pustaka eksternal menggunakan LIBSvariabel. Misalnya:

win32:LIBS += path/to/Psapi.lib
dirkgently
sumber
1
Maaf untuk pertanyaan timpang, tetapi haruskah perpustakaan psapi sudah dibuat sebelumnya atau QtCreator akan mengurusnya?
Dfr
11

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

tidak akan berfungsi karena Anda menggunakan spasi di Program Files. Dalam hal ini Anda harus menambahkan tanda kutip, sehingga hasilnya akan terlihat seperti ini: LIBS + = "C: \ Program Files \ OpenCV \ lib" . Saya sarankan untuk menempatkan perpustakaan di lokasi non-ruang putih ;-)

martin
sumber
Versi terbaru Qt (Creator) selalu menginginkan (satu) garis miring ke depan sebagai pemisah direktori. Satu-satunya pengecualian adalah saat Anda menggunakan perintah "sistem" pada Windows. Maka Anda perlu memberi makan sistem sebuah garis miring ke belakang yang lolos, yaitu dua garis miring ke belakang. Untuk mengganti semua garis miring ke depan dengan dua garis miring ke belakang dapat dilakukan sebagai berikut: WINDIR = $$DIR,WINDIR ~=s,/,\\,g
adlag
6

Kesalahan yang Anda maksud adalah karena jalur penyertaan tambahan tidak ada. Coba tambahkan dengan: INCLUDEPATH + = C: \ path \ to \ include \ files \ Hope it works. Salam.


sumber
4

Dan untuk menambahkan beberapa file library bisa anda tulis seperti dibawah ini:

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 / Widget E: / DebugLibrary / VTK / Wrapping

Libs * = -LE: / DebugLibrary / VTKBin / bin / melepaskan -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-Bantuan
sumber
3

Jika Anda ingin menerapkan aplikasi Anda pada mesin pelanggan, daripada hanya menggunakan aplikasi Anda sendiri, kami menemukan bahwa LIBS+= -Lxxx -lyyymetode ini dapat menyebabkan kebingungan jika bukan masalah.

Kami mengembangkan aplikasi untuk Linux, Mac dan Windows menggunakan Qt. Kami mengirimkan aplikasi yang lengkap dan berdiri sendiri. Jadi semua pustaka non-sistem harus disertakan dalam paket penerapan. Kami ingin pelanggan kami dapat menjalankan aplikasi dari stik USB yang sama untuk semua OS. Untuk alasan kompatibilitas platform, stik USB kemudian harus diformat sebagai FAT32, yang tidak mendukung symlink (Linux).

Kami menemukan LIBS+= -Lxxx -lyyyidiom terlalu banyak dari kotak hitam:

  1. Kami tidak tahu persis apa jalur file dari pustaka (statis atau dinamis) yang telah ditemukan oleh linker. Ini tidak nyaman. Linker Mac kami secara teratur menemukan lib yang berbeda dari yang kami pikir sebaiknya digunakan. Ini terjadi beberapa kali dengan pustaka OpenSSL tempat penaut Mac menemukan dan menggunakan versi OpenSSL miliknya - yang lebih lama dan tidak kompatibel - bukan versi yang kami minta.

  2. Kami tidak dapat membayar bahwa linker menggunakan symlink ke pustaka karena ini akan merusak paket penerapan.

  3. Kami ingin melihat dari nama perpustakaan apakah kami menghubungkan perpustakaan statis atau dinamis.

Jadi untuk kasus khusus kami, kami hanya menggunakan jalur file absolut dan memeriksa apakah ada. Kami menghapus semua symlink.

Pertama kami mencari tahu sistem operasi apa yang kami gunakan dan meletakkannya di variabel CONFIG. Dan, misalnya untuk Linux 64bit, maka:

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
}

Semua dependensi dapat disalin ke dalam paket penerapan seperti yang kita ketahui jalur filenya.

adlag
sumber
1

Saya ingin menambahkan, demi kelengkapan, Anda juga dapat menambahkan PATH PERPUSTAKAAN yang akan mencari perpustakaan dependen (yang mungkin tidak langsung direferensikan dalam kode Anda, tetapi perpustakaan yang Anda gunakan mungkin memerlukannya).

Sebagai perbandingan, ini akan sesuai dengan apa yang dilakukan lingkungan LIBPATH tetapi jenisnya tidak jelas di Qt Creator dan tidak didokumentasikan dengan baik.

Cara saya menyadarinya adalah sebagai berikut:

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

Pada dasarnya jika Anda tidak memberikan nama pustaka yang sebenarnya, itu menambahkan jalur ke tempat itu akan mencari pustaka yang bergantung. Perbedaan sintaksnya kecil tetapi ini sangat berguna untuk menyediakan hanya PATH di mana mencari perpustakaan dependen. Terkadang hanya merepotkan untuk menyediakan setiap jalur perpustakaan individu di mana Anda tahu semuanya ada di folder tertentu dan Qt Creator akan mengambilnya.

zar
sumber
0

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

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

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