将特征值与cmake结合使用 我对C++和CMake比较新,试图在我的CKEY项目中使用这个库,但是我不能让它工作。
我搜索了Stackoverflow和Google,但没有找到适合我的解决方案 我当前的目录结构 ./CMakeLists.txt ./src/CMakeLists.txt 为了进行编译,我使用的是gcc和g++,这两种版本都是随Home brew安装的7.3.0_1版 因为它是一个只包含头的库,所以我假设只使用include\u目录就足够了。我还尝试使用在上提到的官方方法,但这也不起作用 在当前的配置中,我遇到了很多错误,看起来像这样,只是一个小摘录:将特征值与cmake结合使用 我对C++和CMake比较新,试图在我的CKEY项目中使用这个库,但是我不能让它工作。,c++,cmake,eigen,C++,Cmake,Eigen,我搜索了Stackoverflow和Google,但没有找到适合我的解决方案 我当前的目录结构 ./CMakeLists.txt ./src/CMakeLists.txt 为了进行编译,我使用的是gcc和g++,这两种版本都是随Home brew安装的7.3.0_1版 因为它是一个只包含头的库,所以我假设只使用include\u目录就足够了。我还尝试使用在上提到的官方方法,但这也不起作用 在当前的配置中,我遇到了很多错误,看起来像这样,只是一个小摘录: **/evsr/src/lib/e
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:18:8: error: 'traits' is not a class template
struct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
^~~~~~
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:18:15: error: 'Matrix' was not declared in this scope
struct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
^~~~~~
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:18:15: note: suggested alternative: 'atoi'
struct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
^~~~~~
atoi
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:18:75: error: expected unqualified-id before '>' token
struct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
^
In file included from **/evsr/src/infra/random_projection.cc:9:0:
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:179:27: error: expected template-name before '<' token
: public PlainObjectBase<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
^
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:179:27: error: expected '{' before '<' token
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:428:32: error: wrong number of template arguments (3, should be 6)
typedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix; \
^
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:441:1: note: in expansion of macro 'EIGEN_MAKE_TYPEDEFS'
EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \
^~~~~~~~~~~~~~~~~~~
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:449:1: note: in expansion of macro 'EIGEN_MAKE_TYPEDEFS_ALL_SIZES'
EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int, i)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
也许有人遇到了这个或类似的问题,并且知道答案。我为每一个小提示感到高兴。我通过在我的src/CMakeLists.txt中向Eigen头文件添加绝对路径,解决了这个问题
我不太清楚这为什么解决了这个问题,但确实解决了。谢谢你的建议。我已经尝试过这种方法,但它给了我以下错误:src/CMakeLists.txt:39 find_package:找不到由egen3请求的版本3.3提供的具有以下任何名称的包配置文件:egen3Config.cmakegen3-config.CMake将egen3的安装前缀添加到CMake_prefix_路径或者将Eigen3_DIR设置为包含上述文件之一的目录。如果Egeng3提供单独的开发包或SDK,请确保已安装。虽然不是最好的样式,但您的CMakeLists.txt文件显然正在使用Eigen。其他原因导致粘贴的代码段出现一连串错误。详细构建项目,即:使VERBOSE=1,并自上而下修复错误。如果您需要帮助,请使用生成错误的第一个文件中的所有错误更新您的问题。还请注意,@VictorGubin链接的示例表明您的系统上已安装了Egeng,可以通过软件包管理器,也可以通过Egeng文件中的方法2安装。@nega感谢您的评论。你说不是最好的款式是什么意思?有什么可以改进的吗?您可能在最初的调用中使用额外的Eigen太深了,无法包含_目录
cmake_minimum_required(VERSION 3.9)
find_program(CMAKE_C_COMPILER NAMES $ENV{CC} gcc PATHS ENV PATH NO_DEFAULT_PATH)
find_program(CMAKE_CXX_COMPILER NAMES $ENV{CXX} g++ PATHS ENV PATH NO_DEFAULT_PATH)
set(CMAKE_VERBOSE_MAKEFILE ON)
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/bin)
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/build)
set (CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
project(myProject VERSION 0.0.1)
#For Testing
include(CTest)
enable_testing()
SET(SOURCE_FILES main.cc)
add_executable(${CMAKE_PROJECT_NAME}_run ${SOURCE_FILES})
include_directories(src)
add_subdirectory(src)
target_link_libraries(${CMAKE_PROJECT_NAME}_run ${CMAKE_PROJECT_NAME}_lib)
project(${CMAKE_PROJECT_NAME}_lib)
# Clone Eigen
set(EXTERNAL_DIR ${CMAKE_SOURCE_DIR}/src/lib/)
if(NOT EXISTS ${EIGEN_DIR})
find_package(Git REQUIRED)
execute_process(
COMMAND ${GIT_EXECUTABLE} clone https://github.com/eigenteam/eigen-git-mirror ${EXTERNAL_DIR}eigen
)
endif()
set(HEADER_FILES
myHeaders
)
set(SOURCE_FILES
mySources
)
include_directories(lib/eigen/Eigen/)
add_library(${CMAKE_PROJECT_NAME}_lib STATIC ${SOURCE_FILES} ${HEADER_FILES})
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:18:8: error: 'traits' is not a class template
struct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
^~~~~~
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:18:15: error: 'Matrix' was not declared in this scope
struct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
^~~~~~
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:18:15: note: suggested alternative: 'atoi'
struct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
^~~~~~
atoi
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:18:75: error: expected unqualified-id before '>' token
struct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
^
In file included from **/evsr/src/infra/random_projection.cc:9:0:
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:179:27: error: expected template-name before '<' token
: public PlainObjectBase<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
^
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:179:27: error: expected '{' before '<' token
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:428:32: error: wrong number of template arguments (3, should be 6)
typedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix; \
^
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:441:1: note: in expansion of macro 'EIGEN_MAKE_TYPEDEFS'
EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \
^~~~~~~~~~~~~~~~~~~
**/evsr/src/lib/eigen/Eigen/src/Core/Matrix.h:449:1: note: in expansion of macro 'EIGEN_MAKE_TYPEDEFS_ALL_SIZES'
EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int, i)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include_directories(${CMAKE_SOURCE_DIR}/src/lib/eigen/)