Bagaimana cara agar CMake menautkan file yang dapat dieksekusi ke pustaka bersama eksternal yang tidak dibuat dalam proyek CMake yang sama?
Melakukan saja sudah target_link_libraries(GLBall ${CMAKE_BINARY_DIR}/res/mylib.so)
memberikan kesalahan
make[2]: *** No rule to make target `res/mylib.so', needed by `GLBall'. Stop.
make[1]: *** [CMakeFiles/GLBall.dir/all] Error 2
make: *** [all] Error 2
(GLBall is the executable)
setelah saya menyalin perpustakaan ke dir biner bin/res
.
Saya mencoba menggunakan find_library(RESULT mylib.so PATHS ${CMAKE_BINARY_DIR}/res)
Yang gagal dengan RESULT-NOTFOUND
.
link_directories
tidak disarankan, bahkan dalam dokumentasinya sendiri. Saya pikir akan lebih baik di sini untuk menyelesaikanfind_library
panggilan gagal di pertanyaan awal, atau menggunakan solusi @ Andre.find_library
dan menggunakan jalur ini alih-alih melakukan hard coding, lih. jawabanku .Jawaban arrowdodger benar dan disukai di banyak kesempatan. Saya hanya ingin menambahkan alternatif untuk jawabannya:
Anda dapat menambahkan target perpustakaan "diimpor", sebagai ganti direktori tautan. Sesuatu seperti:
Lalu tautkan seolah-olah pustaka ini dibuat oleh proyek Anda:
Pendekatan seperti itu akan memberi Anda sedikit lebih banyak fleksibilitas: Lihatlah perintah add_library () dan banyak properti target yang terkait dengan pustaka yang diimpor .
Saya tidak tahu apakah ini akan menyelesaikan masalah Anda dengan "versi terbaru dari libs".
sumber
add_library( mylib SHARED IMPORTED )
atau Anda mendapatkanadd_library called with IMPORTED argument but no library type
kesalahanIMPORTED_LOCATION
braket pembukaan salahGLOBAL
setelahIMPORTED
jika Anda ingin mengakses perpustakaan yang diimpor di direktori di atas saat ini:add_library(breakpad STATIC IMPORTED GLOBAL)
Saya berasumsi Anda ingin menautkan ke pustaka bernama foo , nama filenya biasanya berupa tautan
foo.dll
ataulibfoo.so
.1. Temukan perpustakaan
Anda harus mencari perpustakaan. Ini adalah ide yang bagus, meskipun Anda mengetahui jalur ke perpustakaan Anda. CMake akan error jika perpustakaan menghilang atau mendapat nama baru. Ini membantu untuk menemukan kesalahan lebih awal dan menjelaskan kepada pengguna (mungkin sendiri) apa yang menyebabkan masalah.
Untuk menemukan perpustakaan foo dan menyimpan jalan yang
FOO_LIB
digunakanCMake akan mengetahui sendiri bagaimana nama file sebenarnya. Ia memeriksa tempat-tempat biasa seperti
/usr/lib
,/usr/lib64
dan jalur masukPATH
.Anda sudah tahu lokasi perpustakaan Anda. Tambahkan ke
CMAKE_PREFIX_PATH
saat Anda memanggil CMake, maka CMake juga akan mencari perpustakaan Anda di jalur yang dilewati.Terkadang Anda perlu menambahkan petunjuk atau akhiran jalur, lihat dokumentasi untuk mengetahui detailnya: https://cmake.org/cmake/help/latest/command/find_library.html
2. Tautkan perpustakaan Dari 1. Anda memiliki nama perpustakaan lengkap
FOO_LIB
. Anda menggunakan ini untuk menautkan perpustakaan ke target AndaGLBall
seperti padaAnda harus menambahkan
PRIVATE
,PUBLIC
atauINTERFACE
setelah target, lih dokumentasi: https://cmake.org/cmake/help/latest/command/target_link_libraries.htmlJika Anda tidak menambahkan salah satu penentu visibilitas ini, itu akan berperilaku seperti
PRIVATE
atauPUBLIC
, tergantung pada versi CMake dan kebijakan yang ditetapkan.3. Tambahkan penyertaan (Langkah ini mungkin tidak wajib.)
Jika Anda juga ingin menyertakan file header, gunakan yang
find_path
mirip denganfind_library
dan cari file header. Kemudian tambahkan direktori include yangtarget_include_directories
mirip dengantarget_link_libraries
.Dokumentasi: https://cmake.org/cmake/help/latest/command/find_path.html dan https://cmake.org/cmake/help/latest/command/target_include_directories.html
Jika tersedia untuk perangkat lunak eksternal, Anda dapat mengganti
find_library
danfind_path
denganfind_package
.sumber
find_package
jauh lebih sederhana daripada mengikuti langkah-langkah initarget_link_libraries(mylib "${FOO_LIB}")
? "Targetnyamylib
bukan target sebenarnya," katanyaGLBall
. tidak masuk akal bagi sayaSatu lagi alternatif, jika Anda bekerja dengan Appstore, memerlukan "Hak" dan karena itu perlu ditautkan dengan Apple-Framework.
Agar Hak dapat bekerja (mis. GameCenter) Anda harus memiliki "Tautan Biner dengan Perpustakaan" -buildstep dan kemudian menautkan dengan "GameKit.framework". CMake "menyuntikkan" pustaka pada "level rendah" ke dalam baris perintah, oleh karena itu Xcode tidak benar - benar mengetahuinya, dan karena itu Anda tidak akan mengaktifkan GameKit di layar Kapabilitas.
Salah satu cara untuk menggunakan CMake dan memiliki "Tautan dengan Binari" -buildstep adalah dengan membuat xcodeproj dengan CMake, lalu gunakan 'sed' untuk 'mencari & mengganti' dan menambahkan GameKit dengan cara yang disukai XCode ...
Skripnya terlihat seperti ini (untuk Xcode 6.3.1).
simpan ini ke "gamecenter.sed" dan kemudian "terapkan" seperti ini (ini mengubah xcodeproj Anda!)
Anda mungkin harus mengubah perintah skrip agar sesuai dengan kebutuhan Anda.
Peringatan: kemungkinan akan rusak dengan versi Xcode yang berbeda karena format proyek dapat berubah, nomor unik (hardcode) mungkin tidak benar-benar unik - dan umumnya solusi oleh orang lain lebih baik - jadi kecuali Anda perlu Mendukung Appstore + Hak (dan build otomatis), jangan lakukan ini.
Ini adalah bug CMake, lihat http://cmake.org/Bug/view.php?id=14185 dan http://gitlab.kitware.com/cmake/cmake/issues/14185
sumber