CMake: target_link_libraries включает как SYSTEM для подавления предупреждений компилятора - PullRequest
0 голосов
/ 02 сентября 2018

Для подавления предупреждений компилятора, исходящих из библиотек, которые я использую в своем приложении, я вручную включаю их каталоги с target_include_directories(myapp SYSTEM ...) в качестве системных библиотек перед добавлением их с target_link_libraries, например так:

add_executable(myapp myapp.cpp)
target_include_directories(myapp SYSTEM
  PRIVATE "extern/lib/include"
)
target_link_libraries(myapp lib::lib)

Тем не менее, этот вид кажется хакерским и сломается, если разработчики lib решат изменить путь включения. Это не будет проблемой, если использовать только target_link_library, но, конечно, они будут включены через -I, и снова я получу предупреждения компилятора, приходящие из этого включения.

Есть ли более элегантный и надежный способ сделать это? Было бы замечательно, если бы у target_link_libraries была опция SYSTEM, указывающая cmake включить ее в качестве системной библиотеки.

1 Ответ

0 голосов
/ 02 сентября 2018

Я определил функцию для этого:

function(target_link_libraries_system target)
  set(libs ${ARGN})
  foreach(lib ${libs})
    get_target_property(lib_include_dirs ${lib} INTERFACE_INCLUDE_DIRECTORIES)
    target_include_directories(${target} SYSTEM PRIVATE ${lib_include_dirs})
    target_link_libraries(${target} ${lib})
  endforeach(lib)
endfunction(target_link_libraries_system)

Теперь я могу позвонить target_link_libraries_system(myapp lib::lib), и каталоги включения считываются из свойств цели.

Теперь это можно расширить, указав область действия PUBLIC|PRIVATE|INTERFACE, но поскольку я использую ее в исполняемом файле, на данный момент этого достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...