Добавление в 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 определена немного вверх. Когда я использую команду сообщения для отображения содержимого переменных флага, это выглядит хорошо:

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

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

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

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

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

Спасибо, Tobias

Ответ 1

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

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}. Else, похоже, что-то вроде создания списка CMake.

Ответ 2

Так как CMake 3.4 вы делаете:

string(APPEND CMAKE_CXX_FLAGS " -lglapi")

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

add_compile_options(-lglapi)

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

target_compile_options(my_lib PUBLIC -lglapi)

Флаги на цели могут быть PUBLIC, PRIVATE или INTERFACE, позволяющие транзитно пересылать флаги из одной цели в другую.