Jelas Anda perlu meletakkan perpustakaan yang Anda inginkan di tempat saya meletakkan *boost libraries here*. Misalnya, jika Anda menggunakan perpustakaan filesystemand, regexAnda akan menulis:
Perhatikan bahwa Anda tidak perlu menentukan komponen untuk pustaka hanya header, seperti lexical_cast. Jadi Anda hanya perlu perintah find_packagedan include_directories.
miguel. Mulai
1
Pada Windows, menambahkan ini ke file cmake Anda juga dapat membantu: ADD_DEFINITIONS (-DBOOST_ALL_NO_LIB) jika tidak, Anda mungkin akan mengalami stackoverflow.com/questions/28887680/…
Stéphane
apakah mungkin untuk menyetel BOOST_USE_STATIC_LIBS ke ON dan Boost_USE_STATIC_RUNTIME OFF? & sebaliknya.
cumi
5
Apa *boost libraries here*maksudnya
IgorGanapolsky
2
Anda juga dapat menggunakan FIND_PACKAGE(Boost REQUIRED COMPONENTS system)jika Anda tidak tahu versi pasti dari peningkatan yang akan digunakan
smac89
78
Anda dapat menggunakan find_package untuk mencari perpustakaan pendorong yang tersedia. Ini menunda mencari Boost ke FindBoost.cmake , yang secara default diinstal dengan CMake.
Setelah menemukan Boost, find_package()panggilan tersebut akan mengisi banyak variabel (periksa referensi untuk FindBoost.cmake ). Diantaranya adalah BOOST_INCLUDE_DIRS, variabel Boost_LIBRARY dan Boost_XXX_LIBRARY, dengan XXX diganti dengan library Boost tertentu. Anda dapat menggunakan ini untuk menentukan include_directories dan target_link_libraries .
Misalnya, Anda memerlukan boost :: program_options dan boost :: regex, Anda akan melakukan sesuatu seperti:
find_package(Boost REQUIRED COMPONENTS program_options regex )
include_directories( ${Boost_INCLUDE_DIRS})
add_executable( run main.cpp )# Example application based on main.cpp# Alternatively you could use ${Boost_LIBRARIES} here.
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY})
Beberapa tip umum:
Saat menelusuri, FindBoost memeriksa variabel lingkungan $ ENV {BOOST_ROOT}. Anda dapat menyetel variabel ini sebelum memanggil find_package jika perlu.
Ketika Anda memiliki beberapa versi build dari boost (multi-threaded, static, shared, dll.), Anda dapat menentukan konfigurasi yang Anda inginkan sebelum memanggil find_package. Lakukan ini dengan menetapkan beberapa variabel berikut untuk On: Boost_USE_STATIC_LIBS, Boost_USE_MULTITHREADED,Boost_USE_STATIC_RUNTIME
Saat mencari Boost di Windows, berhati-hatilah dengan penautan otomatis. Baca "CATATAN untuk Pengguna Visual Studio" di referensi .
Saran saya adalah menonaktifkan penautan otomatis dan menggunakan penanganan ketergantungan cmake: add_definitions( -DBOOST_ALL_NO_LIB )
Dalam beberapa kasus, Anda mungkin perlu secara eksplisit menentukan bahwa Boost dinamis digunakan: add_definitions( -DBOOST_ALL_DYN_LINK )
Perhatikan bahwa tidak perlu lagi menetapkan direktori include secara manual, karena sudah ditangani melalui target yang diimpor Boost::filesystemdan Boost::regex. regexdan filesystemdapat diganti dengan pustaka peningkatan apa pun yang Anda butuhkan.
Bagaimana tampilan ini jika Anda ingin mengatakan untuk menautkan ke semua peningkatan? Maksud saya tanpa mencantumkan semua perpustakaan yang ada dalam peningkatan.
Toby Brull
4
Jika Anda hanya menggunakan bagian penguat hanya header, 'Boost :: boost' sudah cukup. Semua pustaka peningkatan yang dikompilasi harus ditentukan secara eksplisit.
oLen
2
@oLen Di mana saya dapat menemukan daftar semua cmake Boost yang diimpor :: * target? Bagaimana saya tahu ke mana saya harus menautkan?
Markus
8
Semoga ini bisa bermanfaat bagi sebagian orang. Saya mengalami kesalahan nakal:
referensi tidak ditentukan ke simbol '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0: kesalahan menambahkan simbol: DSO hilang dari baris perintah
Ada beberapa masalah cmakeList.txt dan entah bagaimana saya kehilangan untuk secara eksplisit menyertakan pustaka "sistem" dan "sistem berkas". Jadi, saya menulis baris ini di CMakeLists.txt
Baris-baris ini ditulis di awal sebelum membuat proyek yang dapat dieksekusi, karena pada tahap ini kita tidak perlu menghubungkan perpustakaan pendorong ke proyek yang dapat dieksekusi.
Saya setuju dengan jawaban 1 dan 2 . Namun, saya lebih suka menentukan setiap perpustakaan secara terpisah. Ini membuat ketergantungan lebih jelas dalam proyek-proyek besar. Namun, ada bahaya salah ketik nama variabel (case-sensitive). Dalam hal ini tidak ada kesalahan cmake langsung tetapi beberapa masalah linker referensi yang tidak ditentukan nanti, yang mungkin memerlukan beberapa waktu untuk diselesaikan. Oleh karena itu saya menggunakan fungsi cmake berikut:
function(VerifyVarDefined)
foreach(lib ${ARGV})if(DEFINED ${lib})else(DEFINED ${lib})
message(SEND_ERROR "Variable ${lib} is not defined")
endif(DEFINED ${lib})
endforeach()
endfunction(VerifyVarDefined)
Untuk contoh yang disebutkan di atas, ini terlihat seperti:
VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARYBoost_REGEX_LIBRARY)
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY})
Jika saya telah menulis "BOOST_PROGRAM_OPTIONS_LIBRARY" akan ada kesalahan yang dipicu oleh cmake dan tidak lama kemudian dipicu oleh linker.
Jawaban:
Taruh ini di
CMakeLists.txt
file Anda (ubah opsi apa pun dari NONAKTIF ke AKTIF jika Anda mau):Jelas Anda perlu meletakkan perpustakaan yang Anda inginkan di tempat saya meletakkan
*boost libraries here*
. Misalnya, jika Anda menggunakan perpustakaanfilesystem
and,regex
Anda akan menulis:sumber
lexical_cast
. Jadi Anda hanya perlu perintahfind_package
daninclude_directories
.*boost libraries here*
maksudnyaFIND_PACKAGE(Boost REQUIRED COMPONENTS system)
jika Anda tidak tahu versi pasti dari peningkatan yang akan digunakanAnda dapat menggunakan find_package untuk mencari perpustakaan pendorong yang tersedia. Ini menunda mencari Boost ke FindBoost.cmake , yang secara default diinstal dengan CMake.
Setelah menemukan Boost,
find_package()
panggilan tersebut akan mengisi banyak variabel (periksa referensi untuk FindBoost.cmake ). Diantaranya adalahBOOST_INCLUDE_DIRS
, variabel Boost_LIBRARY dan Boost_XXX_LIBRARY, dengan XXX diganti dengan library Boost tertentu. Anda dapat menggunakan ini untuk menentukan include_directories dan target_link_libraries .Misalnya, Anda memerlukan boost :: program_options dan boost :: regex, Anda akan melakukan sesuatu seperti:
Beberapa tip umum:
On
:Boost_USE_STATIC_LIBS
,Boost_USE_MULTITHREADED
,Boost_USE_STATIC_RUNTIME
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
sumber
Mengadaptasi jawaban @ LainIwakura untuk sintaks CMake modern dengan target yang diimpor, ini akan menjadi:
Perhatikan bahwa tidak perlu lagi menetapkan direktori include secara manual, karena sudah ditangani melalui target yang diimpor
Boost::filesystem
danBoost::regex
.regex
danfilesystem
dapat diganti dengan pustaka peningkatan apa pun yang Anda butuhkan.sumber
Semoga ini bisa bermanfaat bagi sebagian orang. Saya mengalami kesalahan nakal: referensi tidak ditentukan ke simbol '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0: kesalahan menambahkan simbol: DSO hilang dari baris perintah Ada beberapa masalah cmakeList.txt dan entah bagaimana saya kehilangan untuk secara eksplisit menyertakan pustaka "sistem" dan "sistem berkas". Jadi, saya menulis baris ini di CMakeLists.txt
Baris-baris ini ditulis di awal sebelum membuat proyek yang dapat dieksekusi, karena pada tahap ini kita tidak perlu menghubungkan perpustakaan pendorong ke proyek yang dapat dieksekusi.
Sekarang di akhir file, saya menulis baris ini dengan mempertimbangkan "KeyPointEvaluation" sebagai proyek saya yang dapat dieksekusi.
sumber
Saya setuju dengan jawaban 1 dan 2 . Namun, saya lebih suka menentukan setiap perpustakaan secara terpisah. Ini membuat ketergantungan lebih jelas dalam proyek-proyek besar. Namun, ada bahaya salah ketik nama variabel (case-sensitive). Dalam hal ini tidak ada kesalahan cmake langsung tetapi beberapa masalah linker referensi yang tidak ditentukan nanti, yang mungkin memerlukan beberapa waktu untuk diselesaikan. Oleh karena itu saya menggunakan fungsi cmake berikut:
Untuk contoh yang disebutkan di atas, ini terlihat seperti:
Jika saya telah menulis "BOOST_PROGRAM_OPTIONS_LIBRARY" akan ada kesalahan yang dipicu oleh cmake dan tidak lama kemudian dipicu oleh linker.
sumber
Coba katakan dokumentasi Boost :
Jangan lupa untuk mengganti foo ke nama dan komponen proyek Anda dengan milik Anda!
sumber