С Cmake я хотел бы применить некоторые общие флаги как к исполняемым файлам, так и к библиотекам.Публичные флаги не применяются к библиотекам (cmake)
Ну, я думал, что могу использовать target_compile_options с помощью ключевого слова PUBLIC. Я тестировал на небольшом примере с исполняемым файлом и статической библиотекой, имеющей только один файл (main.c & mylib.c), но это не работает должным образом.
Корень CMakeLists.txt выглядит следующим образом:
cmake_minimum_required(VERSION 3.0)
# Add the library
add_subdirectory(mylib)
# Create the executable
add_executable(mytest main.c)
# Link the library
target_link_libraries(mytest mylib)
# Add public flags
target_compile_options(mytest PUBLIC -Wall)
И библиотечный CMakeLists.txt:
cmake_minimum_required(VERSION 3.0)
add_library(mylib STATIC mylib.c)
Флаг -Wall применяется только на main.c и не в файле библиотеки (mylib.c):
[ 25%] Building C object mylib/CMakeFiles/mylib.dir/mylib.c.o
cd /patsux/Programmation/Repositories/test-cmake-public/build/mylib && /usr/lib/hardening-wrapper/bin/cc -o CMakeFiles/mylib.dir/mylib.c.o -c /patsux/Programmation/Repositories/test-cmake-public/mylib/mylib.c
[ 50%] Linking C static library libmylib.a
[ 25%] Building C object CMakeFiles/mytest.dir/main.c.o
/usr/lib/hardening-wrapper/bin/cc -Wall -o CMakeFiles/mytest.dir/main.c.o -c /patsux/Programmation/Repositories/test-cmake-public/main.c
Теперь, если флаги применяются к библиотеке вместо исполняемого файла, которые работают.
# Add public flags on the library
target_compile_options(mylib PUBLIC -Wall)
я получаю:
[ 25%] Building C object mylib/CMakeFiles/mylib.dir/mylib.c.o
cd /patsux/Programmation/Repositories/test-cmake-public/build/mylib && /usr/lib/hardening-wrapper/bin/cc -Wall -o CMakeFiles/mylib.dir/mylib.c.o -c /patsux/Programmation/Repositories/test-cmake-public/mylib/mylib.c
[ 50%] Linking C static library libmylib.a
[ 75%] Building C object CMakeFiles/mytest.dir/main.c.o
/usr/lib/hardening-wrapper/bin/cc -Wall -o CMakeFiles/mytest.dir/main.c.o -c /patsux/Programmation/Repositories/test-cmake-public/main.c
[100%] Linking C executable mytest
Это не имеет смысла устанавливать общие флаги, такие как тип цели на библиотеке.
Как я могу совместно использовать общие флаги? Я знаю, что могу использовать add_definitions(). Правильно ли это?
Я также протестировал:
set_target_properties(mytest PROPERTIES COMPILE_FLAGS -Wall)
Но флаги не являются публичными.
Да. Вероятно, я буду использовать ** add_compile_options() ** для применения флагов как для компиляторов C, так и для C++. – Patsux
Я не знал о add_compile_options(). Вы правы, это лучший вариант. Я редактирую свой ответ – wasthishelpful