簡體   English   中英

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

[英]Using Eigen Lib in my Cmake project?

我在我的 CMake 項目中使用僅標頭庫 (Eigen) 時遇到困難。 當我刪除與 Eigen 庫相關的所有部分時,它會編譯,但不確定如何使用 (Eigen) 進行構建。 請注意,Eigen 在 Eigen 文件夾中有一個 CmakeLists.txt,它有 /src 文件夾,其中有(*.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)

您正在嘗試將 Eigen 作為編譯庫包含在內。 但是,正如您所說,Eigen 實際上是一個只有頭文件的庫,不需要編譯,只需包含. 根本不應該有.cpp文件。

刪除該行

ADD_LIBRARY(Eigen ${CMAKE_SOURCE_DIR}/Eigen)

因為這適用於 靜態或共享庫 現在您沒有構建 Eigen,您可以刪除該行

TARGET_INCLUDE_DIRECTORIES(Eigen ...

Eigen CMakeLists 文件實際上只是將 Eigen 頭文件復制到包含目錄,並且不編譯任何內容。 有關如何在 CMake 中使用 Eigen 的示例,請參閱鏈接。

您只需要 INCLUDE_DIRECTORIES 中的正確路徑(還要確保包含正確的文件夾或子文件夾,具體取決於您在 C++ 文件中使用的是 #include Eigen/something.h 還是 #include something.h )因此,刪除行 ADD_LIBRARY(特征 ... 和 TARGET_LINK_LIBRARIES 特征。

對於故障排除,您還可以包含 Eigen 文件夾的絕對路徑,然后當您運行時,將其轉換為相對路徑

這是一個遲到的答案,但它可能會幫助其他人。 這些是我為了將 Eigen 庫包含到我的帶有 CMake 文件的項目中而采取的精確步驟。

首先,假設您的項目已經包含 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
)

第三,通過指定提示EIGEN3_ROOTFindEigen3.cmake文件的位置,從您的CMakeLists.txt “包含”特征:

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)")

第四,從你的項目中開始使用 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM