Это явное связывание с OpenMP :: OpenMP_CXX все еще необходимо с этой командой связывания CMake? - PullRequest
1 голос
/ 19 июня 2020

Я использую параллельные алгоритмы CMake и GNU и следующий фрагмент кода в моем CMakeLists.txt:

if (OPENMP_FOUND)
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif().

Делает ли это лишнюю следующую команду?

target_link_libraries(MyTarget OpenMP::OpenMP_CXX)?

У меня есть пытался найти ответ здесь , но безуспешно. После печати вывода вышеуказанных переменных с помощью команды message я вижу, что последние две пустые.

-- OpenMP_CXX_FLAGS are: -fopenmp
-- OpenMP_C_FLAGS are: -Xclang -fopenmp 
-- CMAKE_EXE_LINKER_FLAGS are:  
-- OpenMP_EXE_LINKER_FLAGS are:

Я попытался найти определение переменной здесь , но не смог узнать больше. Небольшая тестовая программа, использующая:

__gnu_parallel::for_each 

, работала параллельно независимо от того, включил ли я:

target_link_libraries(MyTarget OpenMP::OpenMP_CXX) 

, что приводит меня к выводу, что в этом нет необходимости. Это правда?

Мой gcc это g++-9 (Homebrew GCC 9.3.0_1) 9.3.0.

Спасибо!

1 Ответ

2 голосов
/ 19 июня 2020

Хотя код:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")

обновит ваши флаги компиляции C ++ с правильной опцией -fopenmp, это старый устаревший подход.

Связывая с предоставленной импортированной целью OpenMP::OpenMP_CXX, вы добиваетесь того же эффекта, потому что эта цель предоставляет параметр компиляции -fopenmp в своем свойстве INTERFACE_COMPILE_OPTIONS. Аналогичным образом, эта импортированная цель распространяет любые зависимые библиотеки OpenMP, которые могут вам понадобиться (в зависимости от языка), которые в противном случае потребовали бы дополнительного ручного шага по связыванию с ${OpenMP_CXX_LIBRARIES}. Таким образом, предпочтительным подходом должно быть прямое связывание с импортированной целью OpenMP::OpenMP_CXX; он избавляет вас от дополнительных ручных действий и соответствует современным аксиомам CMake:

target_link_libraries(MyTarget PRIVATE OpenMP::OpenMP_CXX)

Обратите внимание, что официальная документация для CMake OpenMP Find Module и переменных / целей, которые он предоставляет, здесь .

...