[英]Using Eigen Lib in my Cmake project?
我在我的 CMake 項目中使用僅標頭庫 (Eigen) 時遇到困難。 當我刪除與 Eigen 庫相關的所有部分時,它會編譯,但不確定如何使用 (Eigen) 進行構建。 請注意,Eigen 在 Eigen 文件夾中有一個 CmakeLists.txt,它有 /src 文件夾,其中有(*.h 和 *.cpp)與矩陣運算等相關...
我的程序結構如下
Myproject(文件夾)由以下部分組成:
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)
您只需要 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_ROOT
和FindEigen3.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.