cmake - детектируем математические функции из math.h
От: andyp  
Дата: 01.05.15 15:50
Оценка:
Столкнулся тут недавно со генерацией файлов проекта для 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
От: MTD https://github.com/mtrempoltsev
Дата: 02.05.15 07:48
Оценка:
Здравствуйте, andyp, Вы писали:

A>Столкнулся тут недавно со генерацией файлов проекта для msvc 2013. Проект использует asinh, acosh, tgamma, lgamma и еще несколько математических функций. Дело в том, что cmake (даже его самая последняя сборка для windows) не детектирует эти функции и внутри проекта вместо них используются самопальные определения.


Ну так он и не должен, он просто генерирует сборочный файл с указанием зависимостей.

A>Проблемы начинаются при линковке библиотеки, когда линкер жалуется на duplicate definitions в разных модулях (моих и crt).

A>Научите, как помочь cmake с детектированием или как наиболее грамотно выйти из положения.

А тебе какие нужны? Твои или crt?
Re[2]: cmake - детектируем математические функции из math.h
От: andyp  
Дата: 02.05.15 08:29
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>А тебе какие нужны? Твои или crt?


Проект кросс-платформенный. Где-то эти функции есть, где-то — нет. Где нет — используются самопалы. Просто, чтобы правильно возможности платформы определялись.
Re[3]: cmake - детектируем математические функции из math.h
От: MTD https://github.com/mtrempoltsev
Дата: 02.05.15 09:26
Оценка:
Здравствуйте, andyp, Вы писали:

A>Проект кросс-платформенный. Где-то эти функции есть, где-то — нет. Где нет — используются самопалы. Просто, чтобы правильно возможности платформы определялись.


Из под cmake можно сделать пробную компиляцию, если прошла, то определяешь переменную типа USE_MY_SAMOPAL и в своем коде добавляешь дефайны вокруг своих методов.
Re: cmake - детектируем математические функции из math.h
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 02.05.15 12:25
Оценка:
Здравствуйте, andyp, Вы писали:

A>Научите, как помочь cmake с детектированием или как наиболее грамотно выйти из положения.


Есть, например, такой вариант.
Re[4]: cmake - детектируем математические функции из math.h
От: andyp  
Дата: 02.05.15 18:41
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Из под cmake можно сделать пробную компиляцию, если прошла, то определяешь переменную типа USE_MY_SAMOPAL и в своем коде добавляешь дефайны вокруг своих методов.


Там так и сделано на каждую функцию определеяется свое HAVE_BLA_BLA_BLA, если она детектируется. Проблемы в false negative с msvc 2013 — т.е. cmake не находит те функции, которые есть в библиотеке, соответственно, не определяет макросы, ну а дальше получаем дубликаты при линковке.
Re[2]: cmake - детектируем математические функции из math.h
От: andyp  
Дата: 02.05.15 18:57
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Есть, например, такой вариант.


Спасибо, посмотрю.
Re[5]: cmake - детектируем математические функции из math.h
От: MTD https://github.com/mtrempoltsev
Дата: 02.05.15 19:17
Оценка:
Здравствуйте, andyp, Вы писали:

A>Проблемы в false negative с msvc 2013 — т.е. cmake не находит те функции, которые есть в библиотеке


А ты как ищешь?
Re[6]: cmake - детектируем математические функции из math.h
От: andyp  
Дата: 02.05.15 20:26
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>А ты как ищешь?


Да стандарно, как подглядел у других. Пробовал 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
Отредактировано 02.05.2015 20:40 andyp . Предыдущая версия . Еще …
Отредактировано 02.05.2015 20:27 andyp . Предыдущая версия .
Re[7]: cmake - детектируем математические функции из math.h
От: TAL_Shadow  
Дата: 02.05.15 21:12
Оценка: 15 (1)
Здравствуйте, andyp, Вы писали:

A>Здравствуйте, MTD, Вы писали:


допиши
set(CMAKE_REQUIRED_FLAGS "/FI: math.h" ) — тут я с опцией мог напутать — нужно инклюднуть файл
Почему так происходит найдешь в cmake-3.0\Modules\CheckFunctionExists.c

для СХХ лучше используй check_cxx_symbol_exists
Отредактировано 02.05.2015 21:23 TAL_Shadow . Предыдущая версия .
Re[8]: cmake - детектируем математические функции из math.h
От: andyp  
Дата: 02.05.15 22:31
Оценка:
Здравствуйте, 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() и все заработало
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.