Saya menggunakan arm-linux-androideabi-g++
kompiler. Ketika saya mencoba mengkompilasi sederhana "Halo, Dunia!" programnya kompilasi dengan baik. Ketika saya mengujinya dengan menambahkan penanganan pengecualian sederhana dalam kode itu juga berfungsi (setelah menambahkan -fexceptions
.. Saya kira itu dinonaktifkan secara default).
Ini untuk perangkat Android, dan saya hanya ingin menggunakan CMake, bukan ndk-build
.
Sebagai contoh - first.cpp
#include <iostream>
using namespace std;
int main()
{
try
{
}
catch (...)
{
}
return 0;
}
./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions
Ia bekerja tanpa masalah ...
Masalahnya ... Saya mencoba mengkompilasi file dengan file CMake.
Saya ingin menambahkan -fexceptions
sebagai bendera. Saya mencoba
set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )
dan
set ( CMAKE_C_FLAGS "fexceptions")
Itu masih menampilkan kesalahan.
Jawaban:
Misalkan Anda ingin menambahkan bendera tersebut (lebih baik mendeklarasikannya dalam konstanta):
Ada beberapa cara untuk menambahkannya:
Yang termudah (tidak bersih, tapi mudah dan nyaman, dan hanya berfungsi untuk mengompilasi flag, C&C ++ sekaligus):
Menambahkan ke variabel CMake yang sesuai:
Menggunakan properti target, lih. doc CMake kompilasi flag target property dan perlu tahu nama target.
Saat ini saya menggunakan metode 2.
sumber
string(APPEND CMAKE_EXE_LINKER_FLAGS "new_value")
lebih pendek dan lebih bersih daripadaset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} new_value")
Dalam versi CMake yang lebih baru Anda dapat mengatur flag compiler dan linker untuk satu target dengan
target_compile_options
dantarget_link_libraries
masing - masing (ya, yang terakhir juga mengatur opsi linker):Keuntungan dari metode ini adalah Anda dapat mengontrol penyebaran opsi ke target lain yang bergantung pada ini melalui
PUBLIC
danPRIVATE
.Pada CMake 3.13 Anda juga dapat menggunakan
target_link_options
untuk menambahkan opsi tautan yang membuat maksudnya lebih jelas.sumber
target_compile_options(main_static PRIVATE --static)
tetapi sepertinya tidak berhasil, tahu mengapa?-static
mungkin merupakan tautan, bukan opsi penyusun. Coba lewatitarget_link_libraries
.target_link_libraries
saya melewatkan bagian dokumen itu: "Tentukan perpustakaan atau bendera yang akan digunakan ketika menautkan target yang diberikan.". Terima kasih.target_link_options
sebagai cara yang lebih bersih untuk menentukan flag-flag linker. Anda harus menghindari menggunakantarget_link_libraries
untuk bendera penghubung di masa depan dan menggunakannyatarget_link_options
sebagai gantinya.Coba atur variabel
CMAKE_CXX_FLAGS
alih-alihCMAKE_C_FLAGS
:Variabel
CMAKE_C_FLAGS
hanya memengaruhi kompiler C, tetapi Anda mengkompilasi kode C ++.Menambahkan bendera ke
CMAKE_EXE_LINKER_FLAGS
berlebihan.sumber
Anda juga dapat menambahkan bendera penghubung ke target tertentu menggunakan
LINK_FLAGS
properti:Jika Anda ingin menyebarkan perubahan ini ke target lain, Anda dapat membuat target tiruan untuk ditautkan.
sumber
Kasir ucm_add_flags dan ucm_add_linker_flags macro dari UCM (saya set macro CMake berguna) - mereka berurusan dengan menambahkan bendera compiler / linker.
sumber