Cmake не меняет флаги сборки - PullRequest
0 голосов
/ 25 апреля 2020

Рассмотрим следующую простую программу openMP:

program hello
    use OMP_LIB
    implicit none
    integer   :: nthreads, tid

    !$OMP PARALLEL PRIVATE(nthreads, tid)
    tid = omp_get_thread_num()
    nthreads = omp_get_num_threads()
    ! print *, "hello"
    print *,"Thread:", tid, "of", nthreads
    !$OMP END PARALLEL
end program hello

когда я скомпилирую ее как

gfortran -fopenmp hello.90 -o hello.x

Я получаю вывод как:

Тема: 2 из 4

Тема: 1 из 4

Тема: 0 из 4

Тема: 3 из 4

, как и ожидалось.

Теперь, если я рассмотрю следующий CMakeLists.txt файл

cmake_minimum_required(VERSION 2.8.9)
project (hello Fortran)
enable_language(Fortran)

IF(NOT CMAKE_BUILD_TYPE)
  message("NO BUILD TYPE PROVIDED")
  message("DEFAULT BUILD TYPE SET TO 'Release'")
  set(CMAKE_BUILD_TYPE 'Release')
ENDIF()
IF(${CMAKE_BUILD_TYPE} MATCHES RELEASE OR ${CMAKE_BUILD_TYPE} MATCHES Release)
  message("MAKING RELEASE BUILD")
  set(CMAKE_Fortran_FLAGS_RELEASE "-fopenmp")
  message("FLAGS: ${CMAKE_Fortran_FLAGS_RELEASE}")
ENDIF()

add_executable(hello.x hello.f90)

Учитывая, что приведенный выше файл является правильным, он должен добавить флаг omp, чтобы создать файл и, следовательно, скомпилировать и запустить то же самое, однако

$ mkdir build; cd build
$ cmake ..
-- The Fortran compiler identification is GNU 6.1.0
-- Checking whether Fortran compiler has -isysroot
-- Checking whether Fortran compiler has -isysroot - yes
-- Checking whether Fortran compiler supports OSX deployment target flag
-- Checking whether Fortran compiler supports OSX deployment target flag - yes
-- Check for working Fortran compiler: /usr/local/bin/gfortran
-- Check for working Fortran compiler: /usr/local/bin/gfortran - works
-- Detecting Fortran compiler ABI info
-- Detecting Fortran compiler ABI info - done
-- Checking whether /usr/local/bin/gfortran supports Fortran 90
-- Checking whether /usr/local/bin/gfortran supports Fortran 90 - yes
NO BUILD TYPE PROVIDED
DEFAULT BUILD TYPE SET TO 'Release'
MAKING RELEASE BUILD
FLAGS: -fopenmp
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/user/Programs/omp/build

$
$ make
Scanning dependencies of target hello.x
[ 50%] Building Fortran object CMakeFiles/hello.x.dir/hello.f90.o
[100%] Linking Fortran executable hello.x
Undefined symbols for architecture x86_64:
  "_omp_get_num_threads_", referenced from:
      _MAIN__ in hello.f90.o
  "_omp_get_thread_num_", referenced from:
      _MAIN__ in hello.f90.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make[2]: *** [hello.x] Error 1
make[1]: *** [CMakeFiles/hello.x.dir/all] Error 2

Что соответствует отсутствующему флагу -fopenmp. Как его добавить?

1 Ответ

0 голосов
/ 27 апреля 2020

Команда set для CMAKE_BUILD_TYPE, по-видимому, принимает "нестроковый" аргумент.

Изменение

set(CMAKE_BUILD_TYPE 'Release')

на

set(CMAKE_BUILD_TYPE Release)

решило проблема для меня. Я сначала копался в системе кеша, чтобы понять, почему ваши настройки не будут работать, и не было никаких причин. Я нашел запись CMAKE_Fortran_FLAGS_'Release' в ccmake и снова посмотрел на переменную CMAKE_BUILD_TYPE в документах, и она принимает значения empty, Debug, Release, RelWithDebInfo, MinSizeRel (которые я понял как без кавычек).

...