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