在我的Cmake项目中使用Eigen Lib?

时间:2015-02-01 19:51:32

标签: c++ cmake eigen

我在CMake项目中使用仅限标题的库(Eigen)时遇到了困难。当我取消与Eigen库相关的所有部分时,它编译,但不确定如何构建(Eigen)。请注意,Eigen在Eigen文件夹中有一个CmakeLists.txt,并且它的/ src文件夹具有与Matrix操作等相关的(* .h和* .cpp)...

我的程序结构如下

Myproject(文件夹)由以下内容组成:

  • 的CMakeLists.txt
  • /构建
  • /来源

Source文件夹包含一堆我的文件(* .h和* .cpp)和/ Eigen(文件夹)。

我所做的是:

FIND_PACKAGE(PkgConfig REQUIRED)
PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0)
LIST(APPEND CMAKE_CXX_FLAGS 
    "-std=c++0x
     -pthread 
     ${CMAKE_CXX_FLAGS} 
     -g 
    -Wall -Wextra ")

ADD_LIBRARY(Eigen ${CMAKE_SOURCE_DIR}/Eigen)
TARGET_INCLUDE_DIRECTORIES(Eigen INTERFACE
 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
 $<INSTALL_INTERFACE:include/Eigen>
)

INCLUDE_DIRECTORIES(${GTK3_INCLUDE_DIRS})
ADD_DEFINITIONS(${GTK3_CFLAGS_OTHERS})
INCLUDE_DIRECTORIES(include)
ADD_LIBRARY(RTT 
        Def.cpp 
        Def.h       
        krnel.cpp 
        krnel.h 
        Mesh.cpp 
        Mesh.h 
        Mcom.cpp 
        Mcom.h 
        timer.h 
        Identifier.h)       

ADD_EXECUTABLE(Rdrtst main.cpp)
TARGET_LINK_LIBRARIES(Rdrtst RTT ${GTK3_LIBRARIES} Eigen)

当我cd到/ Build并输入(Cmake ../Source)

我得到以下内容:

[/../Build]$ cmake ../Source
-- Configuring done
CMake Error: Cannot determine link language for target "Eigen".
CMake Error: CMake can not determine linker language for target:Eigen
-- Generating done
-- Build files have been written to: /../../MyProject/Build

eigen文件夹包含CMakeLists.txt,内容如下:

include(RegexUtils)
test_escape_string_as_regex()

file(GLOB Eigen_directory_files "*")

escape_string_as_regex(ESCAPED_CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")

foreach(f ${Eigen_directory_files})
  if(NOT f MATCHES "\\.txt" AND NOT f MATCHES "${ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/[.].+" AND NOT f MATCHES "${ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/src")
    list(APPEND Eigen_directory_files_to_install ${f})
  endif()
endforeach(f ${Eigen_directory_files})

install(FILES
  ${Eigen_directory_files_to_install}
  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen COMPONENT Devel
  )

add_subdirectory(src)

3 个答案:

答案 0 :(得分:1)

您正在尝试将Eigen包含为已编译的库。但是,正如您所说,Eigen实际上只是一个头文件库,不需要编译,只需included。根本不应该有.cpp个文件。

删除行

ADD_LIBRARY(Eigen ${CMAKE_SOURCE_DIR}/Eigen)

因为这是static or shared libraries的意思。既然您没有构建Eigen,您可以删除该行

TARGET_INCLUDE_DIRECTORIES(Eigen ...

Eigen CMakeLists文件实际上只是将Eigen头文件复制到include目录中,并且不编译任何东西。有关如何在CMake中使用Eigen的示例,请参阅this链接。

答案 1 :(得分:1)

你只需要INCLUDE_DIRECTORIES中的正确路径(同时确保包含正确的文件夹或子文件夹,具体取决于你在c ++文件中使用#include Eigen / something.h或#include something.h) 因此,删除行ADD_LIBRARY(Eigen ...和TARGET_LINK_LIBRARIES Eigen。

对于疑难解答,您还可以包含Eigen文件夹的绝对路径,然后当它工作时,将其转换为相对路径

答案 2 :(得分:0)

这是一个迟到的答案,但它可能会帮助其他人。这些是我使用CMake文件将Eigen lib包含到我的项目中的精确步骤。

首先,假设您的项目已包含Eigen子目录,例如src/third_party/eigen,请将FindEigen3.cmake文件复制粘贴到src/cmake

第二次,您可能需要修改FindEigen3.cmake以包含您将从CMake文件中提供的位置提示。例如:

find_path( EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library
    HINTS "${EIGEN3_ROOT}" "$ENV{EIGEN3_ROOT_DIR}" "${EIGEN3_INCLUDE_DIR_HINTS}"
    # ... leave the rest as it is
)

第三次,通过指定提示CMakeLists.txtEIGEN3_ROOT文件的位置,“包括”FindEigen3.cmake中的Eigen:

message(STATUS "Trying to include Eigen library")
set(EIGEN3_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/third_party/eigen)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
find_package(Eigen3 3.2.0 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})
message(STATUS "EIGEN: " ${EIGEN3_VERSION} " (internal)")

Forth ,从项目中开始使用Eigen:

#include <Eigen/Dense>
using Eigen::MatrixXd;
// ...
MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
std::cout << m << std::endl;