首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Debian上查找GeographicLib中的CMake

在Debian上查找GeographicLib中的CMake
EN

Stack Overflow用户
提问于 2018-01-09 13:50:01
回答 3查看 6.8K关注 0票数 5

在Debian上,我安装了cmake和地理库,如下所示:

代码语言:javascript
运行
复制
stew@stewbian:~$apt-get install build-essential cmake libgeographic-dev

我的CMakeLists.txt文件如下所示:

代码语言:javascript
运行
复制
cmake_minimum_required(VERSION 3.7)
project(geoexample)

find_package(GeographicLib REQUIRED)

add_executable(geoexample main.cpp)

target_include_directories(geoexample PRIVATE ${GeographicLib_INCLUDE_DIRS})
target_compile_definitions(geoexample PRIVATE ${GeographicLib_DEFINITIONS})
target_link_libraries     (geoexample         ${GeographicLib_LIBRARIES})

我的main.cpp也非常简单(直接取自示例):

代码语言:javascript
运行
复制
#include <iostream>
#include <GeographicLib/Geodesic.hpp>
using namespace std;
using namespace GeographicLib;
int main() {
    const Geodesic& geod = Geodesic::WGS84();
    // Distance from JFK to LHR
    double
      lat1 = 40.6, lon1 = -73.8, // JFK Airport
      lat2 = 51.6, lon2 = -0.5;  // LHR Airport
    double s12;
    geod.Inverse(lat1, lon1, lat2, lon2, s12);
    cout << s12 / 1000 << " km\n";
    return 0;
}

当我运行mkdir build && cd build && cmake ..

代码语言:javascript
运行
复制
stew@stewbian:~/src/geoexample/build$ cmake ..
CMake Error at CMakeLists.txt:3 (find_package):
  By not providing "FindGeographicLib.cmake" in CMAKE_MODULE_PATH this
  project has asked CMake to find a package configuration file provided by
  "GeographicLib", but CMake did not find one.

我认为在默认情况下,cmake搜索/usr/share/cmake-3.7/Modules,但是libgeographic似乎已经将其Find*.cmake安装到/usr/share/cmake/geographiclib/FindGeographicLib.cmake中。这是令人沮丧的,但是我自己(加上每个需要编译我的代码的人)应该能够在这个简单的情况下使用解决方案(如果我还需要从旧位置包含类似FindBoost.cmake的内容,它就不会工作得那么好)。

代码语言:javascript
运行
复制
stew@stewbian:~/src/geoexample/build$ cmake .. -DCMAKE_MODULE_PATH=/usr/share/cmake/geographiclib
CMake Error at /usr/share/cmake-3.7/Modules/FindPackageHandleStandardArgs.cmake:138 (message):
  Could NOT find GeographicLib (missing: GeographicLib_LIBRARY_DIRS
  GeographicLib_INCLUDE_DIRS)
Call Stack (most recent call first):
  /usr/share/cmake-3.7/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake/geographiclib/FindGeographicLib.cmake:28 (find_package_handle_standard_args)
  CMakeLists.txt:4 (find_package)


-- Configuring incomplete, errors occurred!

现在我不知道该怎么做了。我可以确认安装了/usr/lib/x86_64-linux-gnu/libGeographic.a/usr/lib/x86_64-linux-gnu/libGeographic.so的libgeographic包。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-30 14:45:07

我编写了自己的FindGeographicLib.cmake来找到它,并将它安装在项目的一个子文件夹中。然后,我将${CMAKE_MODULES_PATH}指向项目的CMakeLists.txt中的这个文件夹:

代码语言:javascript
运行
复制
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/modules)

首先,我添加了由libgeographic部署的那个:

代码语言:javascript
运行
复制
cp /usr/share/cmake/geographiclib/FindGeographicLib.cmake ./modules/FindGeographicLib.cmake

不幸的是,这是不可能的。这个库是在/usr/lib/x86_64-linux-gnu/libGeographic.so找到的,脚本处理的不是很好。它试图(但失败)在/usr/lib/include中找到标头。我对脚本做了一些调整,以检查这个例子,现在我有了一个可行的解决方案。

新的FindGeographicLib.cmake如下所示。我的改动是在适当的行的右边加上注释。

代码语言:javascript
运行
复制
# Look for GeographicLib
#
# Sets
#  GeographicLib_FOUND = TRUE
#  GeographicLib_INCLUDE_DIRS = /usr/local/include
#  GeographicLib_LIBRARIES = /usr/local/lib/libGeographic.so
#  GeographicLib_LIBRARY_DIRS = /usr/local/lib

find_library (GeographicLib_LIBRARIES Geographic
  PATHS "${CMAKE_INSTALL_PREFIX}/../GeographicLib/lib")

  if (GeographicLib_LIBRARIES)
  get_filename_component (GeographicLib_LIBRARY_DIRS
    "${GeographicLib_LIBRARIES}" PATH)

  get_filename_component (_ROOT_DIR "${GeographicLib_LIBRARY_DIRS}" PATH)
  set (GeographicLib_INCLUDE_DIRS "${_ROOT_DIR}/include")
  set (GeographicLib_BINARY_DIRS "${_ROOT_DIR}/bin")
  if (NOT EXISTS "${GeographicLib_INCLUDE_DIRS}/GeographicLib/Config.h")
    get_filename_component(_ROOT_DIR "${_ROOT_DIR}" PATH)                     # Added to script
    set (GeographicLib_INCLUDE_DIRS "${_ROOT_DIR}/include")                   # Added to script
    set (GeographicLib_BINARY_DIRS "${_ROOT_DIR}/bin")                        # Added to script
    if (NOT EXISTS "${GeographicLib_INCLUDE_DIRS}/GeographicLib/Config.h")    # Added to script
      unset (GeographicLib_INCLUDE_DIRS)
      unset (GeographicLib_LIBRARIES)
      unset (GeographicLib_LIBRARY_DIRS)
      unset (GeographicLib_BINARY_DIRS)
    endif()                                                                   # Added to script
  endif ()
  unset (_ROOT_DIR)                                                           # Moved below if() statements
endif ()

include (FindPackageHandleStandardArgs)
find_package_handle_standard_args (GeographicLib DEFAULT_MSG
  GeographicLib_LIBRARY_DIRS GeographicLib_LIBRARIES GeographicLib_INCLUDE_DIRS)
mark_as_advanced (GeographicLib_LIBRARY_DIRS GeographicLib_LIBRARIES
  GeographicLib_INCLUDE_DIRS)
票数 3
EN

Stack Overflow用户

发布于 2019-02-09 19:38:15

根据这个错误报告

地理信息库-dev安装程序将FindGeographicLib.cmake文件放入:FindGeographicLib.cmake 正确的位置是:/usr/share/cmak-3.5/Modules

实际上,它取决于当前安装的cmake版本。在Ubuntu 18.04,是3-10。

所以你可以这样解决这个问题:

代码语言:javascript
运行
复制
sudo ln -s /usr/share/cmake/geographiclib/FindGeographicLib.cmake /usr/share/cmake-3.10/Modules/
票数 4
EN

Stack Overflow用户

发布于 2022-08-08 14:58:08

下游项目的解决方案:添加

代码语言:javascript
运行
复制
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};/usr/share/cmake/geographiclib")

就在find_package(GeographicLib REQUIRED)之前。这修复了损坏的Debian/Ubuntu安装程序。其他发行版可能会把文件放到别处,尽管.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48169653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档