Столкнулся тут недавно со генерацией файлов проекта для msvc 2013. Проект использует asinh, acosh, tgamma, lgamma и еще несколько математических функций. Дело в том, что cmake (даже его самая последняя сборка для windows) не детектирует эти функции и внутри проекта вместо них используются самопальные определения. Проблемы начинаются при линковке библиотеки, когда линкер жалуется на duplicate definitions в разных модулях (моих и crt).
Для того, чтобы заставить cmake увидеть нужные функции перепробовал CHECK_CXX_SYMBOL_EXISTS, CHECK_SYMBOL_EXISTS and CHECK_FUNCTION_EXISTS.
Научите, как помочь cmake с детектированием или как наиболее грамотно выйти из положения.
Re: cmake - детектируем математические функции из math.h
Здравствуйте, andyp, Вы писали:
A>Столкнулся тут недавно со генерацией файлов проекта для msvc 2013. Проект использует asinh, acosh, tgamma, lgamma и еще несколько математических функций. Дело в том, что cmake (даже его самая последняя сборка для windows) не детектирует эти функции и внутри проекта вместо них используются самопальные определения.
Ну так он и не должен, он просто генерирует сборочный файл с указанием зависимостей.
A>Проблемы начинаются при линковке библиотеки, когда линкер жалуется на duplicate definitions в разных модулях (моих и crt). A>Научите, как помочь cmake с детектированием или как наиболее грамотно выйти из положения.
А тебе какие нужны? Твои или crt?
Re[2]: cmake - детектируем математические функции из math.h
Здравствуйте, MTD, Вы писали:
MTD>А тебе какие нужны? Твои или crt?
Проект кросс-платформенный. Где-то эти функции есть, где-то — нет. Где нет — используются самопалы. Просто, чтобы правильно возможности платформы определялись.
Re[3]: cmake - детектируем математические функции из math.h
Здравствуйте, andyp, Вы писали:
A>Проект кросс-платформенный. Где-то эти функции есть, где-то — нет. Где нет — используются самопалы. Просто, чтобы правильно возможности платформы определялись.
Из под cmake можно сделать пробную компиляцию, если прошла, то определяешь переменную типа USE_MY_SAMOPAL и в своем коде добавляешь дефайны вокруг своих методов.
Re: cmake - детектируем математические функции из math.h
Здравствуйте, MTD, Вы писали:
MTD>Из под cmake можно сделать пробную компиляцию, если прошла, то определяешь переменную типа USE_MY_SAMOPAL и в своем коде добавляешь дефайны вокруг своих методов.
Там так и сделано на каждую функцию определеяется свое HAVE_BLA_BLA_BLA, если она детектируется. Проблемы в false negative с msvc 2013 — т.е. cmake не находит те функции, которые есть в библиотеке, соответственно, не определяет макросы, ну а дальше получаем дубликаты при линковке.
Re[2]: cmake - детектируем математические функции из math.h
Да стандарно, как подглядел у других. Пробовал CHECK_CXX_SYMBOL_EXISTS, CHECK_SYMBOL_EXISTS, CHECK_FUNCTION_EXISTS. Превые два варианта, на сколько понимаю, должны пытаться что-то покомпилять, третий — полинковать с тестовой программкой. Не великий знаток cmake, поэтому больше ничего на ум не приходит.
Т.е пишу в cmakelists.txt:
set(CMAKE_REQUIRED_LIBRARIES m) #это, на сколько понимаю, для gcc нужно
include (CheckFunctionExists)
CHECK_FUNCTION_EXISTS ( asinh HAVE_ASINH )
Ну или
include(CheckCXXSymbolExists)
CHECK_CXX_SYMBOL_EXISTS(asinh, cmath, HAVE_ASINH)
или
include(CheckSymbolExists)
CHECK_SYMBOL_EXISTS(asinh, math.h, HAVE_ASINH)
И все это для msvc 2013 фейлится. Но asinh в либе есть. Есть он и в хидерах:
_GENERIC_MATH1(asinh, _CRTSPECIAL) //хидер xtgmath.h, определение видно, когда инклюдишь math.h
Здравствуйте, andyp, Вы писали:
A>Здравствуйте, MTD, Вы писали:
допиши
set(CMAKE_REQUIRED_FLAGS "/FI: math.h" ) — тут я с опцией мог напутать — нужно инклюднуть файл
Почему так происходит найдешь в cmake-3.0\Modules\CheckFunctionExists.c
Здравствуйте, TAL_Shadow, Вы писали:
TAL>Здравствуйте, andyp, Вы писали:
A>>Здравствуйте, MTD, Вы писали:
TAL>допиши TAL>set(CMAKE_REQUIRED_FLAGS "/FI: math.h" ) — тут я с опцией мог напутать — нужно инклюднуть файл TAL>Почему так происходит найдешь в cmake-3.0\Modules\CheckFunctionExists.c
TAL>для СХХ лучше используй check_cxx_symbol_exists
Спасибо, пост натолкнул на мысль проверить cmakeerror.log
все фейлилось из-за
set(CMAKE_REQUIRED_LIBRARIES m)
которая была воткнута в cmakelists.txt безо всяких условий. линкер ругался на ненайденную библиотеку и обламывал поиск.
воткнул ее в if( NOT MSVC ) endif() и все заработало