【问题标题】:CMake cannot find variable or directoryCMake 找不到变量或目录
【发布时间】:2020-01-23 22:36:28
【问题描述】:

我尝试编译旧代码库。我的环境是(根据代码库的要求):

  • Python 2.7
  • CMake 2.8.10.1

提供的 CMakeLists.txt 如下所示:

cmake_minimum_required(VERSION 2.6)

project(KOL)

set (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
#IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set (CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR})
#ENDIF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)

#check if Eigen exists
find_path(EIGEN_PATH NAMES Eigen PATHS ${EIGEN_DIR} REQUIRED)
if (NOT EIGEN_DIR)
    message(FATAL_ERROR "Eigen is not found, please specify by: -DEIGEN_DIR=<eigen_path>")
endif (NOT EIGEN_DIR)


FILE(GLOB data_files src/data/*.h)
FILE(GLOB loss_files src/loss/*.h)
FILE(GLOB opti_files src/kernel/*.h)
FILE(GLOB comm_files src/common/*.h)

set (data_files ${data_files} 
    src/data/basic_io.cpp 
    )

include_directories(
    ${EIGEN_PATH}
    )

#set (data_files ${datafiles} 
#    src/data/basic_io.cpp 
#    src/data/zlib_io.cpp 
#    src/data/gzip_io.cpp
#    )
source_group("data" FILES ${data_files})
source_group("loss" FILES ${loss_files})
source_group("kernel" FILES ${opti_files})
source_group("common" FILES ${comm_files})

set (SRC_LIST
    ${data_files} ${loss_files} ${opti_files} ${comm_files}
    )

IF(CMAKE_COMPILER_IS_GNUCXX)
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-write-strings -O2 -s")
ENDIF(CMAKE_COMPILER_IS_GNUCXX)

add_executable(KOL src/Params.cpp src/Params.h 
    src/main.cpp ${SRC_LIST}) 
IF(UNIX)
    target_link_libraries(KOL pthread)
ENDIF(UNIX)

add_executable(Cacher src/data/Cacher.cpp ${data_files})
IF(UNIX)
    target_link_libraries(Cacher pthread)
ENDIF(UNIX)

install(TARGETS KOL Cacher
    DESTINATION .)

我的命令是:cmake -EIGEN_DIR=../Eigen -CMAKE_CXX_FLAGS='-std=c++0x -O3' ..

错误是:

loading initial cache file MAKE_CXX_FLAGS=-std=c++0x -O3
CMake Error: Error processing file:MAKE_CXX_FLAGS=-std=c++0x -O3
-- The C compiler identification is Clang 10.0.1
-- The CXX compiler identification is Clang 10.0.1
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
CMake Error at CMakeLists.txt:13 (message):
  Eigen is not found, please specify by: -DEIGEN_DIR=<eigen_path>

我的项目结构是这样的:

--Master
 |--build
 |--Eigen
 |--CMakeLists.txt

我在build 目录中运行了命令。它一直说EIGEN_PATH 未定义且Eigen 未找到。

我试过-EIGEN_DIR=`pwd`/../Eigen。我也尝试使用-DEIGEN_DIR,但仍然遇到同样的错误。请帮忙。

【问题讨论】:

    标签: python c++ cmake


    【解决方案1】:

    您应该在命令行中使用-DEIGEN_DIR 指定包含 FindEigen.cmake 文件的 Eigen 库中的文件夹(使用 `find ../Eigen -name "*.CMake" 搜索它)。

    注意,包名应该完全匹配(区分大小写):

    • 查找模块或配置脚本的名称(FindPackageName.cmake 或 PackageNameConfig.cmake)
    • find_package通话中
    • PackageName_DIR 的名称

    【讨论】:

    • 抱歉,我刚刚看到您没有使用任何 find_package 调用。我的回答不适用。您的问题与find_path 通话有关。您是否尝试过提供-DEIGEN_DIR=..(包含您的 Eigen 文件夹的项目文件夹)?
    【解决方案2】:

    要通过 CMake 命令行指定缓存变量,请在变量名称 EIGEN_DIRCMAKE_CXX_FLAGS 之前使用 -D 标志。这是cmake 命令行options and flags 的文档。因为这会创建 cached 条目,请在运行命令之前尝试清除 CMake 缓存,以消除其中保留的任何陈旧路径。

    另外,请务必使用双引号 " ... " 括住CMAKE_CXX_FLAGS 变量的标志:

    cmake -DEIGEN_DIR=Eigen -DCMAKE_CXX_FLAGS="-std=c++0x -O3" ..
    

    【讨论】:

    • CMAKE_CXX_FLAGS 条目也需要以-D 为前缀,即-DCMAKE_CXX_FLAGS='-std=c++0x -O3'
    • 我试过这个命令还是不行。错误代码为: CMake 错误:此项目中使用了以下变量,但它们设置为 NOTFOUND。请设置它们或确保它们在 CMake 文件中正确设置和测试:EIGEN_PATH
    • 这可能意味着您错误地设置了EIGEN_DIR 路径。尝试将 EIGEN_DIR 设置为 Eigen,因为该变量将相对于包含 CMakeLists.txt 文件的目录进行解释。为安全起见,请在EIGEN_DIR 中提供完整 路径。我编辑了答案以反映这一点。
    猜你喜欢
    • 2021-12-19
    • 2016-08-27
    • 1970-01-01
    • 2017-07-19
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    相关资源
    最近更新 更多