Это из-за стратегии CMake " de-duplication " для параметров компиляции.
С помощью target_compile_options
вы создаете правильный список параметров
-gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 ...
, ноCMake удаляет все -gencode
, кроме первого:
-gencode arch=compute_50,code=sm_50 arch=compute_52,code=sm_52 ...
отчет об ошибках о необходимости отключить "дедупликацию" CMake в некоторых случаях, и он был решен в 3.12 версия путем добавления SHELL:
конструкции.
Начиная с CMake 3.12, это должно работать:
target_compile_options(myHeaderLib INTERFACE
"SHELL:-gencode arch=compute_50,code=sm_50"
"SHELL:-gencode arch=compute_52,code=sm_52"
)
Как SHELL:
работает
Во-первых, размещение комбинированных опций в двойных кавычках не позволяет CMake «дедуплицировать» общие опции: CMake видит разные строки
-gencode arch=compute_50,code=sm_50
-gencode arch=compute_52,code=sm_52
и не считает их дублированными.
Затемконструкция SHELL
объясняет CMake, что строку внутри заданных двойных кавычек необходимо разделить на отдельные параметры командной строки.Но это разбиение выполняется после этапа «дедупликации», поэтому повторяющиеся -gencode
из разных SHELL:
строк не удаляются.