Я использую arm-linux-androideabi-g++
компилятор. Когда я пытаюсь скомпилировать простое «Привет, мир!» Программа компилируется нормально. Когда я тестирую его, добавляя простую обработку исключений в этот код, он тоже работает (после добавления -fexceptions
... Я думаю, по умолчанию он отключен).
Это для устройства Android, и я хочу использовать только CMake, а не ndk-build
.
Например - first.cpp
#include <iostream>
using namespace std;
int main()
{
try
{
}
catch (...)
{
}
return 0;
}
./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions
Работает без проблем ...
Эта проблема ... Я пытаюсь скомпилировать файл с файлом CMake.
Я хочу добавить в -fexceptions
качестве флага. Я пробовал с
set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )
и
set ( CMAKE_C_FLAGS "fexceptions")
По-прежнему отображается ошибка.
Ответы:
Предположим, вы хотите добавить эти флаги (лучше объявить их в константе):
Есть несколько способов добавить их:
Самый простой (не чистый, но легкий и удобный, и работает только для флагов компиляции, C & C ++ сразу):
Присоединение к соответствующим переменным CMake:
Используя целевые свойства, ср. doc CMake свойство флага компиляции и должно знать имя цели.
Прямо сейчас я использую метод 2.
источник
string(APPEND CMAKE_EXE_LINKER_FLAGS "new_value")
короче и чищеset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} new_value")
В более новых версиях CMake вы можете установить флаги компилятора и компоновщика для одной цели с
target_compile_options
иtarget_link_libraries
соответственно (да, последняя также устанавливает опции компоновщика):Преимущество этого метода заключается в том, что вы можете контролировать распространение опций на другие цели, которые зависят от этого, с помощью
PUBLIC
иPRIVATE
.Начиная с CMake 3.13, вы также можете использовать
target_link_options
для добавления параметров компоновщика, что делает намерение более ясным.источник
target_compile_options(main_static PRIVATE --static)
но это не похоже на работу, есть идеи, почему?-static
это, вероятно, компоновщик, а не опция компилятора. Попробуйте передать егоtarget_link_libraries
.target_link_libraries
я пропустил ту часть документа: «Укажите библиотеки или флаги, которые будут использоваться при связывании определенной цели». Спасибо.target_link_options
более чистый способ задания флагов компоновщика. Вы должны избегать использованияtarget_link_libraries
для флагов компоновщика в будущем и использоватьtarget_link_options
вместо этого.Попробуйте установить переменную
CMAKE_CXX_FLAGS
вместоCMAKE_C_FLAGS
:Переменная
CMAKE_C_FLAGS
влияет только на компилятор C, но вы компилируете код C ++.Добавление флага
CMAKE_EXE_LINKER_FLAGS
является излишним.источник
Вы также можете добавить флаги компоновщика к определенной цели, используя
LINK_FLAGS
свойство:Если вы хотите распространить это изменение на другие цели, вы можете создать фиктивную цель для ссылки.
источник
Оформить заказ на ucm_add_flags и ucm_add_linker_flags макросы ЦСМА (мой набор полезных CMake макросов) - они имеют дело с прилагаемыми флагами компилятора / линкера.
источник