将CMAKE_SYSTEM_NAME设置为通用后,未将CMAKE_INSTALL_PREFIX添加到CMAKE_SYSTEM_PREFIX_PATH

时间:2019-06-12 10:10:16

标签: windows cmake

我正在与CMake交叉编译一个项目。 find_library找不到位于${CMAKE_INSTALL_PREFIX}/lib中的库,因为没有按照documentation的要求将CMAKE_INSTALL_PREFIX附加到CMAKE_SYSTEM_PREFIX_PATH

这是因为我在工具链文件中将CMAKE_SYSTEM_NAME设置为Generic。我将工具链文件简化为该单个命令。为什么它会影响CMAKE_INSTALL_PREFIX的行为?

如果我将CMAKE_SYSTEM_NAME设置为LinuxWindows,则CMAKE_SYSTEM_PREFIX_PATH有一些预设,并且还会按预期附加CMAKE_INSTALL_PREFIX

1 个答案:

答案 0 :(得分:0)

我认为此处的文档有误。不会自动将CMAKE_INSTALL_PREFIX添加到CMAKE_SYSTEM_PREFIX_PATH。这是在Windows和Linux平台特有的CMake模块内完成的(例如,计算机上的c:\ Program Files \ CMake \ share \ cmake-3.14 \ Modules \ Platform \ WindowsPaths.cmake)。

要在非Windows和非Linux平台上模仿相同的行为,可以执行以下操作。在工具链文件中,定义唯一的系统名称,并将当前目录添加到CMAKE_MODULE_PATH,以便Cmake在此处查找模块:

set(CMAKE_SYSTEM_NAME "MySystem")
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})

然后在名为<CMAKE_SYSTEM_NAME>.cmake的子文件夹(例如Platform)中创建名为Platform\MySystem.cmake的平台文件。在此文件中,您可以将CMAKE_INSTALL_PREFIX附加到CMAKE_SYSTEM_PREFIX_PATH

# Copied from c:\Program Files\CMake\share\cmake-3.14\Modules\Platform\WindowsPaths.cmake 
if (NOT CMAKE_FIND_NO_INSTALL_PREFIX)
  list(APPEND CMAKE_SYSTEM_PREFIX_PATH
    # Project install destination.
    "${CMAKE_INSTALL_PREFIX}"
  )
  if(CMAKE_STAGING_PREFIX)
    list(APPEND CMAKE_SYSTEM_PREFIX_PATH
      # User-supplied staging prefix.
      "${CMAKE_STAGING_PREFIX}"
    )
  endif()
endif()