Sekitar setahun yang lalu saya bertanya tentang dependensi header di CMake .
Saya menyadari baru-baru ini bahwa masalah tampaknya CMake menganggap file-file header itu eksternal untuk proyek. Setidaknya, ketika membuat proyek Code :: Blocks file header tidak muncul dalam proyek (file sumber lakukan). Oleh karena itu bagi saya CMake menganggap header-header itu sebagai eksternal dari proyek, dan tidak melacak mereka dalam ketergantungan.
Pencarian cepat di tutorial CMake hanya menunjukkan include_directories
yang sepertinya tidak melakukan apa yang saya inginkan ...
Apa cara yang tepat untuk memberi sinyal ke CMake bahwa direktori tertentu berisi header untuk dimasukkan, dan bahwa header tersebut harus dilacak oleh Makefile yang dihasilkan?
.cbp
file proyek. Sekarang jika pemindai dependensi cmake gagal mengidentifikasi file header dengan benar sebagai dependensi untuk Makefile ada cara untuk memperbaikinya tetapi dalam beberapa kasus hal itu akan salah karena tidak menyertakan preprosesor penuh.Jawaban:
Dua hal harus dilakukan.
Pertama, tambahkan direktori yang akan disertakan:
Jika Anda terjebak dengan versi CMake yang sangat lama (2.8.10 atau lebih tua) tanpa dukungan
target_include_directories
, Anda juga dapat menggunakan warisaninclude_directories
sebagai gantinya:Kemudian Anda juga harus menambahkan file header ke daftar file sumber Anda untuk target saat ini, misalnya:
Dengan cara ini, file header akan muncul sebagai dependensi di Makefile, dan juga misalnya dalam proyek Visual Studio yang dihasilkan, jika Anda menghasilkannya.
Cara menggunakan file header itu untuk beberapa target:
sumber
LIBROOT_HEADER_FILES
variabel dalamliba/CMakefile
danlibb/CMakefile
kemudian?include_directories
lebihtarget_include_directories
. Yang pertama menetapkannya secara rekursif untuk semua target dalam direktori itu; sedangkan yang terakhir menetapkannya untuk target. Melakukan yang pertama mematahkan gagasan grafik target di CMake, dan sebagai gantinya bergantung pada efek samping ke hierarki file Anda.target_include_directories
untuk kode CMake modern. Jangan ragu untuk mengundang saya ke obrolan jika Anda tidak setuju dengan perubahan tersebut.Pertama, Anda gunakan
include_directories()
untuk memberi tahu CMake untuk menambahkan direktori-I
ke baris perintah kompilasi. Kedua, Anda daftar header di Andaadd_executable()
atauadd_library()
panggilan.Sebagai contoh, jika sumber proyek Anda ada
src
, dan Anda memerlukan tajuk dariinclude
, Anda dapat melakukannya seperti ini:sumber
add_executable
? Saya pikir CMake tahu menyertakan dependensi file secara otomatis.CMake lebih seperti bahasa skrip jika membandingkannya dengan cara lain untuk membuat Makefile (mis. Make atau qmake). Ini tidak terlalu keren seperti Python, tapi tetap saja.
Tidak ada hal seperti " cara yang tepat " jika mencari di berbagai proyek open source bagaimana orang memasukkan direktori. Tetapi ada dua cara untuk melakukannya.
Mentah include_directories akan menambahkan direktori ke proyek saat ini dan semua proyek turunan lainnya yang akan Anda tambahkan melalui serangkaian perintah add_subdirectory . Kadang-kadang orang mengatakan bahwa pendekatan semacam itu adalah warisan.
Cara yang lebih elegan adalah dengan target_include_directories . Hal ini memungkinkan untuk menambahkan direktori untuk proyek / target tertentu tanpa (mungkin) warisan atau bentrok yang tidak perlu dari berbagai direktori yang disertakan. Juga memungkinkan untuk melakukan bahkan konfigurasi yang halus dan menambahkan salah satu dari penanda berikut untuk perintah ini.
PRIVATE - hanya digunakan untuk target bangunan yang ditentukan ini
PUBLIC - gunakan untuk target yang ditentukan dan untuk target yang menghubungkan dengan proyek ini
INTERFACE - gunakan hanya untuk target yang terhubung dengan proyek saat ini
PS:
Kedua perintah memungkinkan untuk menandai direktori sebagai SISTEM untuk memberikan petunjuk bahwa itu bukan bisnis Anda yang direktori tertentu akan berisi peringatan.
Jawaban yang serupa adalah dengan pasangan perintah lain target_compile_definitions / add_definitions , target_compile_options / CMAKE_C_FLAGS
sumber
Tambah
include_directories("/your/path/here")
.Ini akan mirip
gcc
dengan-I/your/path/here/
opsi menelepon dengan .Pastikan Anda menempatkan tanda kutip ganda di sekitar jalan. Orang lain tidak menyebutkan itu dan itu membuat saya macet selama 2 hari. Jadi jawaban ini adalah untuk orang yang sangat baru di CMake dan sangat bingung.
sumber
Saya memiliki masalah yang sama.
Direktori proyek saya seperti ini:
Dan apa yang saya gunakan untuk memasukkan file di semua folder itu:
Dan itu benar-benar berhasil.
sumber