Я использую 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, но не мог понять, что я здесь не так сделал.
Спасибо,
Тобиас
Попробуйте сделать это вместо этого:
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.
поскольку CMake 3.4 ты сделаешь:
string(APPEND CMAKE_CXX_FLAGS " -lglapi")
Это очень удобно, когда вы хотите установить флаги только для одного языка (C ++ в примере выше), но если вы хотите установить одинаковые флаги для всех языков, вы можете просто сделать:
add_compile_options(-lglapi)
Обе команды изменяют флаги для всего каталога, если вы хотите установить флаги только для одной цели, выполните:
target_compile_options(my_lib PUBLIC -lglapi)
Флаги на мишени могут быть ОБЩЕСТВЕННЫЙ, ЧАСТНЫЙ или ИНТЕРФЕЙС, позволяя транзитивно пересылать флаги от одной цели к другой.