Добавление в 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, позволяющие транзитно пересылать флаги из одной цели в другую.