2016-07-28 4 views
1

С 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) 

Но флаги не являются публичными.

ответ

0

Вы можете добавить флаг, как это в корневом файле:

add_compile_options(-Wall) 

Или, если вы используете версию CMake до 3.0:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") 
+1

Да. Вероятно, я буду использовать ** add_compile_options() ** для применения флагов как для компиляторов C, так и для C++. – Patsux

+0

Я не знал о add_compile_options(). Вы правы, это лучший вариант. Я редактирую свой ответ – wasthishelpful

Смежные вопросы