Присоединение к CMAKE_C_FLAGS

Я использую CMake для проекта, который поставляется в двух версиях, одна из которых требует -lglapi, а другая — нет.

Пока что использованные строки выглядят так:

SET(CMAKE_C_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")
SET(CMAKE_CXX_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")

Я добавил оператор if в свой CMakeList.txt точно после этих строк:

if(SINGLE_MODE)
SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} " -lglapi")
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} " -lglapi")
endif(SINGLE_MODE)

Переменная SINGLE_MODE определена немного выше. Когда я использую команду message для отображения содержимого переменных флага, все выглядит хорошо:

-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm -lglapi

Но когда я начинаю компилировать, я сталкиваюсь с ошибкой компиляции. Используя подробный режим, я понял, что в вызове компилятора это выглядит так:

-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm; -lglapi

То есть каким-то образом точка с запятой была добавлена ​​перед добавлением -lglapi в список.

Кто-нибудь здесь сталкивался с подобной проблемой и знает способ ее устранения? Я довольно долго гуглил и изучал руководство по CMake, но не мог понять, что я здесь не так сделал.

Спасибо,
Тобиас

13

Решение

Попробуйте сделать это вместо этого:

if(SINGLE_MODE)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lglapi")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lglapi")
endif(SINGLE_MODE)

Затем вы уверены, что добавляете -lglapi к существующему ${CMAKE_CXX_FLAGS} строка. Иначе, похоже, что создается что-то вроде списка CMake.

19

Другие решения

поскольку CMake 3.4 ты сделаешь:

string(APPEND CMAKE_CXX_FLAGS " -lglapi")

Это очень удобно, когда вы хотите установить флаги только для одного языка (C ++ в примере выше), но если вы хотите установить одинаковые флаги для всех языков, вы можете просто сделать:

add_compile_options(-lglapi)

Обе команды изменяют флаги для всего каталога, если вы хотите установить флаги только для одной цели, выполните:

target_compile_options(my_lib PUBLIC -lglapi)

Флаги на мишени могут быть ОБЩЕСТВЕННЫЙ, ЧАСТНЫЙ или ИНТЕРФЕЙС, позволяя транзитивно пересылать флаги от одной цели к другой.

4

По вопросам рекламы [email protected]