Set CFLAGS and CXXFLAGS options using CMake
Я просто хочу отладить некоторый код, работающий в Linux, и мне нужна отладочная сборка (-O0 -ggdb
). Поэтому я добавил эти вещи в свой CMakeLists.txt
:
set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")
Когда я попытался скомпилировать, я развернулся, используя make VERBOSE=1
И я наблюдал выходной, вот так
... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2**
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...
Видимо код скомпилирован с "-g -O2"
и это не то, что я хочу. Как я могу заставить его использовать "-O0 -ggdb"
только?
4 ответа
Вам нужно установить флаги после project
Команда в вашем CMakeLists.txt.
Кроме того, если вы звоните include(${QT_USE_FILE})
или же add_definitions(${QT_DEFINITIONS})
Вы должны включить эти set
команды после Qt, так как они будут добавлять дополнительные флаги. Если это так, возможно, вы просто хотите добавить свои флаги к Qt, поэтому измените на:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")
Самое простое решение, которое мне подходит, это:
export CFLAGS=-ggdb
export CXXFLAGS=-ggdb
CMake добавит их во все флаги конфигураций.
Вы должны изменить флаги Cmake C/CXX по умолчанию.
В соответствии с CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE}
положить в основной CMakeLists.txt
один из:
Для C
set(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")
Для C++
set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")
Это переопределит значения, определенные в CMakeCache.txt
В системах Unix для нескольких проектов я добавил эти строки в CMakeLists.txt, и он успешно компилировался, потому что базовые (/ usr / include) и локальные include (/ usr / local / include) помещаются в отдельные каталоги:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")
Он добавляет правильный каталог, включая пути для флагов компилятора C и C++ и правильный путь к каталогу для флагов компоновщика.
Примечание: компилятор C++ (C++) не поддерживает -L, поэтому мы должны использовать CMAKE_EXE_LINKER_FLAGS