Этот код Lua адаптирован из материала, найденного в Википедии, и в инструменте GPSbabel Роберта Липе :
local EARTH_RAD = 6378137.0
-- earth's radius in meters (official geoid datum, not 20,000km / pi)
local radmiles = EARTH_RAD*100.0/2.54/12.0/5280.0;
-- earth's radius in miles
local multipliers = {
radians = 1, miles = radmiles, mi = radmiles, feet = radmiles * 5280,
meters = EARTH_RAD, m = EARTH_RAD, km = EARTH_RAD / 1000,
degrees = 360 / (2 * math.pi), min = 60 * 360 / (2 * math.pi)
}
function gcdist(pt1, pt2, units) -- return distance in radians or given units
--- this formula works best for points close together or antipodal
--- rounding error strikes when distance is one-quarter Earth's circumference
--- (ref: wikipedia Great-circle distance)
if not pt1.radians then pt1 = rad(pt1) end
if not pt2.radians then pt2 = rad(pt2) end
local sdlat = sin((pt1.lat - pt2.lat) / 2.0);
local sdlon = sin((pt1.lon - pt2.lon) / 2.0);
local res = sqrt(sdlat * sdlat + cos(pt1.lat) * cos(pt2.lat) * sdlon * sdlon);
res = res > 1 and 1 or res < -1 and -1 or res
res = 2 * asin(res);
if units then return res * assert(multipliers[units])
else return res
end
end
Не нужно устанавливать все переменные, которые вы устанавливаете. CMake устанавливает их в разумные значения по умолчанию. Вы должны определенно не изменить CMAKE_BINARY_DIR
или CMAKE_CACHEFILE_DIR
. Обработайте их как только для чтения.
Сначала удалите существующий проблемный файл кеша из каталога src:
cd src
rm CMakeCache.txt
cd ..
Затем удалите все команды set()
и выполните:
cd Compile
rm -rf *
cmake ../src
Пока вы не находитесь за исходным каталогом при запуске CMake, он не будет изменять исходный каталог, если ваш CMakeList явно не сообщает об этом.
Как только вы это сделаете, вы можете посмотреть, где CMake помещает вещи по умолчанию, и только если вас не устраивают местоположения по умолчанию (например, значение по умолчанию EXECUTABLE_OUTPUT_PATH
), измените только те, которые вам нужны. И попытайтесь выразить их относительно CMAKE_BINARY_DIR
, CMAKE_CURRENT_BINARY_DIR
, PROJECT_BINARY_DIR
и т. Д.
. Если вы посмотрите на документацию CMake, вы увидите переменные, разделенные на семантические разделы. За исключением особых условий very , вы должны обрабатывать все перечисленные в разделе «Переменные, которые предоставляют информацию» как доступные только для чтения в CMakeLists.
Начиная с CMake Wiki :
CMAKE_BINARY_DIR, если вы создаете исходный код, это то же самое, что и CMAKE_SOURCE_DIR, иначе это каталог верхнего уровня вашего build tree
blockquote>Сравните эти две переменные, чтобы определить, была ли запущена сборка вне источника
Прежде всего, вы не должны ретранслировать имя dir в своем скрипте. строка с ../Compile должна быть изменена.
Это потому, что для пользователя нужно компилировать.
Вместо этого используется одна из предопределенных переменных: http: // www.cmake.org/Wiki/CMake_Useful_Variables (найдите CMAKE_BINARY_DIR и CMAKE_CURRENT_BINARY_DIR)
CMAKE_CURRENT_BINARY_DIR
, обычно рассказывал о текущем двоичном пути сборки. Возможно, он может использоваться для установки зависимых сборников libs / bin.
– parasrish
27 March 2018 в 06:07
Похоже, вы хотите из исходной сборки . Есть несколько способов, которыми вы можете создать сборку источника.
cd /path/to/my/build/folder
cmake /path/to/my/source/folder
, из-за чего cmake будет генерировать дерево сборки в /path/to/my/build/folder
для дерева источника в /path/to/my/source/folder
. Когда вы его создали, cmake запоминает, где находится исходная папка, поэтому вы можете повторно запустить cmake в дереве сборки с помощью cmake /path/to/my/build/folder
или даже cmake .
, если ваш текущий каталог уже является папкой сборки. cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
, которые будут делать то же самое, что и (1), но без зависимости от текущего рабочего каталога. По умолчанию CMake выставляет все свои выходы в дереве сборки , поэтому, если вы не используете ${CMAKE_SOURCE_DIR}
или ${CMAKE_CURRENT_SOURCE_DIR}
в ваших файлах cmake, не должны касаться вашего исходное дерево .
Самое большое, что может пойти не так, если вы уже создали дерево сборки в исходном дереве (т. е. у вас есть в источнике строить). После того, как вы сделали это, вторая часть (1) выше ударит, а cmake не вносит никаких изменений в места источника или сборки. Таким образом, вы не можете создать сборку вне источника для исходного каталога с встроенной сборкой. Вы можете исправить это довольно легко, удалив (как минимум) CMakeCache.txt
из исходного каталога. Есть еще несколько файлов (в основном в каталоге CMakeFiles
), которые CMake генерирует, которые вы также должны удалить, но это не приведет к тому, что cmake обработает исходное дерево как дерево сборки.
Поскольку сборки вне исходного кода часто более желательны, чем сборники в источнике, вы можете изменить свой cmake, чтобы потребовать от исходных построений:
# Ensures that we do an out of source build
MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${CMAKE_BINARY_DIR}" insource)
GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${PARENTDIR}" insourcesubdir)
IF(insource OR insourcesubdir)
MESSAGE(FATAL_ERROR "${MSG}")
ENDIF(insource OR insourcesubdir)
ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)
MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
"${CMAKE_PROJECT_NAME} requires an out of source build."
)
Вышеуказанный макрос происходит из обычно используемого модуля, называемого MacroOutOfSourceBuild
. Есть много источников для MacroOutOfSourceBuild.cmake
в google, но я не могу найти оригинал, и он достаточно короткий, чтобы включить здесь полностью.
К сожалению, cmake обычно записывал несколько файлов к тому моменту, когда макрос вызывается, так что, хотя это не остановит вас от фактического выполнения сборки, вам все равно нужно удалить CMakeCache.txt
и CMakeFiles
.
Возможно, вам будет полезно установить пути, в которых используются двоичные, общие и статические библиотеки записываются в - в этом случае см. , как я могу сделать вывод cmake в «bin» dir? (отказ от ответственности, у меня есть главный голосовой ответ на этот вопрос ... но вот как я знаю о она).
rm -rf *
. Это не очень хорошо, еслиcd Compile
терпит неудачу ... – Roman 28 May 2017 в 06:41Compile
, удалите все, а затем запустите CMake с помощью пути к исходному каталогу. & Quot; Я предполагаю, что основной здравый смысл & amp; суждение по части читателя. – Angew 29 May 2017 в 08:36