В некоторых компиляторах использование pow
и некоторых других функций в программе C требует связывания с библиотекой m
. Однако некоторым компиляторам это не требуется, и при связывании с библиотекой m
возникнет ошибка. Почти идентичная ситуация существует для C++ с std::thread
и pthread
, но модуль CMake FindThreads
полностью облегчает это - есть ли аналогичный модуль для libm?
Как лучше всего определить, что делать с CMake? Это мое текущее решение, которое далеко не идеально, потому что существует гораздо больше компиляторов C, чем только GCC и MSVC:
if(NOT MSVC)
target_link_libraries(my-c-target PUBLIC m)
endif()
Это работает для моих целей, но я почти уверен, что есть случаи, когда это не сработает и потребует ручного вмешательства пользователя, что не очень весело для тех, кто не знает об этой неясности. В идеале я не хочу, чтобы пользователю приходилось указывать, является ли его компилятор странным или нет через командную строку; Я хочу автоматически определять это в CMake, так как в этом весь смысл CMake.
-lm
, потому что это была первая ошибка, которую я когда-либо получал от этого компилятора. Не исключено, что мой конкретный код будет использоваться в таком сценарии. - person LB--   schedule 28.09.2015libm
устанавливается с помощью CMaketarget_link_libraries(MY_TARGET m)
при использовании компилятора Visual Studio v16. - person Wouter Beek   schedule 06.07.2019