Как я могу сказать в CMake, нуждается ли моя среда сборки в связывании с libm для математических функций?

Я использую CMake, модифицирующий некоторый C-код для многоплатформенного построения.

Этот код использует функциональность, и поэтому на платформах Unix должен быть связан с libm бежать. Похоже, что на Windows (с MSVC? Иначе?) libm не является необходимым, и на самом деле не существует.

То, как я справляюсь сейчас, делает libm необязательный. мой CMakeLists.txt имеет:

find_library(HAVE_LIBM m)
target_link_libraries(qgen m)
if (HAVE_LIBM)
    target_link_libraries(dbgen m)
    target_link_libraries(qgen m)
endif()

но это означает, что если libm необходимо и отсутствует, это сбой сборки, а не конфигурации. Я хочу, чтобы в этом случае произошел сбой CMake (с любым сообщением об ошибке, которое может быть уместным). Итак, как я могу определить, нужна ли libm в моей целевой среде сборки? Или - есть ли другой способ добиться того же эффекта?

Редактировать:

Я пробовал решение, предложенное в этом вопросе

# Link against the C math library (libm)
CHECK_FUNCTION_EXISTS(log LOG_FUNCTION_EXISTS)
if(NOT LOG_FUNCTION_EXISTS)
  unset(LOG_FUNCTION_EXISTS)
  list(APPEND CMAKE_REQUIRED_LIBRARIES m)
  CHECK_FUNCTION_EXISTS(log LOG_FUNCTION_EXISTS)
  if(LOG_FUNCTION_EXISTS)
    target_link_libraries(dbgen m)
    target_link_libraries(qgen m)
  else()
    message(FATAL_ERROR "Cannot determine how to make the C\
            standard library math functions available.")
  endif()
endif()

но это не удается, по крайней мере, в Linux, то есть я получаю сообщение об ошибке. Вот соответствующая часть CMakeError.log:

Determining if the function log exists failed with the following output:
Change Dir: /home/eyalroz/src/mine/ssb-dbgen/CMakeFiles/CMakeTmp

Run Build Command:"/usr/bin/make" "cmTC_f6205/fast"
/usr/bin/make -f CMakeFiles/cmTC_f6205.dir/build.make CMakeFiles/cmTC_f6205.dir/build
make[1]: Entering directory '/mnt/sdb3/home-eyalroz/src/mine/ssb-dbgen/CMakeFiles/CMakeTmp'
Building C object CMakeFiles/cmTC_f6205.dir/CheckFunctionExists.c.o
/opt/gcc-8.2/bin/gcc   -DCHECK_FUNCTION_EXISTS=log   -o CMakeFiles/cmTC_f6205.dir/CheckFunctionExists.c.o   -c /usr/local/share/cmake-3.13/Modules/CheckFunctionExists.c
<command-line>: warning: conflicting types for built-in function ‘log’ [-Wbuiltin-declaration-mismatch]
/usr/local/share/cmake-3.13/Modules/CheckFunctionExists.c:7:3: note: in expansion of macro ‘CHECK_FUNCTION_EXISTS’
   CHECK_FUNCTION_EXISTS(void);
   ^~~~~~~~~~~~~~~~~~~~~
Linking C executable cmTC_f6205
/usr/local/bin/cmake -E cmake_link_script CMakeFiles/cmTC_f6205.dir/link.txt --verbose=1
/opt/gcc-8.2/bin/gcc  -DCHECK_FUNCTION_EXISTS=log    -rdynamic CMakeFiles/cmTC_f6205.dir/CheckFunctionExists.c.o  -o cmTC_f6205 
CMakeFiles/cmTC_f6205.dir/CheckFunctionExists.c.o: In function `main':
CheckFunctionExists.c:(.text+0x10): undefined reference to `log'
collect2: error: ld returned 1 exit status
CMakeFiles/cmTC_f6205.dir/build.make:86: recipe for target 'cmTC_f6205' failed
make[1]: *** [cmTC_f6205] Error 1
make[1]: Leaving directory '/mnt/sdb3/home-eyalroz/src/mine/ssb-dbgen/CMakeFiles/CMakeTmp'
Makefile:121: recipe for target 'cmTC_f6205/fast' failed

Это может работать на Windows, но это должно работать везде...

0 ответов

Другие вопросы по тегам