CMake I 解压并使用第三方Eigen库

目录

一、CMake命令及语法

 1.CMAKE_COMMAND

2.CMAKE_CURRENT_BINARY_DIR

3.add_custom_target(构建时运行自定义命令)

4.cmake -E命令 

(1)解压、压缩

(2)重命名

二、源码

1.CMakeLists.txt

2.test.cpp

三、配置及构建

1.配置

2.构建 


        本文将展示如何提取Eigen库文件,并使用提取的源文件编译我们的项目。首先我们需要先下载Eigen压缩包(我下载到的zip文件路径为D:\thirdParties\eigen-3.4.0.zip

一、CMake命令及语法

 1.CMAKE_COMMAND

        cmake路径。

message(STATUS "CMAKE_COMMAND=${CMAKE_COMMAND}")
#CMAKE_COMMAND=D:/soft/CMake/bin/cmake.exe

2.CMAKE_CURRENT_BINARY_DIR

        当前正在处理的二进制目录路径。

message(STATUS "CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}")
#CMAKE_CURRENT_BINARY_DIR=D:/FCJProject/cmakeProgram/cmakeStudy/UseEigenTestFile/build

3.add_custom_target(构建时运行自定义命令)

        添加一个具有给定名称的目标,以执行给定命令。目标没有输出文件,即使命令试图创建具有目标名称的文件,也始终被视为过期。构建过程中必须执行一系列没有输出的命令时,可以使用 add_custom_target 命令。

add_custom_target(Name 
                  [ALL] 
                  [command1 [args1...]]
                  [COMMAND command2 [args2...] ...]
                  [DEPENDS depend depend depend ... ]
                  [BYPRODUCTS [files...]]
                  [WORKING_DIRECTORY dir]
                  [COMMENT comment]
                  [JOB_POOL job_pool]
                  [VERBATIM] [USES_TERMINAL]
                  [COMMAND_EXPAND_LISTS]
                  [SOURCES src1 [src2...]])
  • ALL:表明应将此目标添加到默认生成目标,以便每次都运行它(传递了 ALL 参数,该目标将始终被执行)。
  • COMMAND:指定要执行哪些命令。
  • DEPENDS:将COMMAND和DEPENDS 附加到第一个指定输出的自定义命令。
  • BYPRODUCTS:指定命令预期生成的文件,但其修改时间可能比依赖项的新,也可能不比依赖项的新。
  • WORKING_DIRECTORY:工作目录,指定在何处执行命令。
  • COMMENT:用于指定CMake在执行自定义目标时输出什么样的消息。
  • JOB_POOL:为Ninja生成器指定一个池。
  • VERBATIM:对于构建工具,命令的所有参数都将被正确转义,以便被调用的命令接收到的每个参数不变。请注意,在add_custom_target 甚至看到参数之前,CMake语言处理器仍然使用一级转义。建议使用VERBATIM,因为它可以保证正确的行为。如果不指定VERBATIM,则行为是依赖于平台的,因为CMake没有针对于特定工具中特殊字符的保护措施。
  • COMMAND_EXPAND_LISTS:命令参数中的列表将展开,包括使用生成器表达式创建的列表。
  • SOURCES:指定了包含进该目标的额外的源文件。即使这些源文件没有构建规则,但是它们会被增加到IDE的工程文件中以方便编辑。

        add_custom_target 添加的目标没有输出,因此总会执行。因此,在子目录中的CMakeLists.txt引入自定义目标时,在主 CMakeLists.txt 中仍然能够引用它。 

add_custom_target(unpack-eigen 
	ALL 	
	COMMAND  
		${CMAKE_COMMAND} -E tar xzf D:/thirdParties/eigen-3.4.0.zip
	COMMAND 
		${CMAKE_COMMAND} -E rename eigen-3.4.0 eigen3.4.0
	WORKING_DIRECTORY
		${CMAKE_CURRENT_BINARY_DIR}
	COMMENT
		"Unpacking Eigen3 in ${CMAKE_CURRENT_BINARY_DIR}/eigen3.4.0"
	)

构建系统中引入了一个名为 unpack-eigen 的目标:

  • 第一个命令用来提取存档,第二个命令用来将提取的目录重命名为eigen3.4.0
  • 使用cmake  -E 标志:调用CMake命令,来执行实际的工作。(可以在命令行输入cmake -E来获得特定操作系统的完整列表)

4.cmake -E命令 

(1)解压、压缩

        tar [cxt][vf][zjJ] file.tar [file/dir1 file/dir2 ...]

必选参数(不能同时使用):

  • -c:创建归档文件
  • -x:解压
  • -t:查看压缩文件内容

可选参数:

  • -z:gzip压缩,处理.tar.gz格式
  • -j:bz2压缩,处理.tar.bz2格式
  • -v:显示所有过程

必选参数:

  • -f:最后一个参数,后接归档文件名

(2)重命名

        rename oldname newname

二、源码

1.CMakeLists.txt

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(testEigen LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIERD ON)
 
add_custom_target(unpack-eigen 
	ALL 	
	COMMAND   
		${CMAKE_COMMAND} -E tar xzf D:/thirdParties/eigen-3.4.0.zip
	COMMAND 
		${CMAKE_COMMAND} -E rename eigen-3.4.0 eigen3.4.0
	WORKING_DIRECTORY
		${CMAKE_CURRENT_BINARY_DIR}
	COMMENT
		"Unpacking Eigen3 in ${CMAKE_CURRENT_BINARY_DIR}/eigen3.4.0"
	)
add_executable(test test.cpp)
#由于源文件的编译依赖于Eigen头文件,需要显式地指定可执行目标对自定义目标的依赖关系
add_dependencies(test unpack-eigen)
#指定包含目录
target_include_directories(test 
	PRIVATE
	${CMAKE_CURRENT_BINARY_DIR}/eigen3.4.0)

2.test.cpp

#include <chrono>
#include <iostream>

#include <Eigen/Dense>

EIGEN_DONT_INLINE
double simple_function(Eigen::VectorXd &va,Eigen::VectorXd &vb)
{
	double d=va.dot(vb);
	return d;
}

int main()
{
	int len=1000000;
	int num_repetitions=100;
	
	Eigen::VectorXd va=Eigen::VectorXd::Random(len);
	Eigen::VectorXd vb=Eigen::VectorXd::Random(len);
	
	double result;
	auto start=std::chrono::system_clock::now();
	for(auto i=0;i<num_repetitions;i++)
	{
		result=simple_function(va,vb);
	}
	auto end=std::chrono::system_clock::now();
	
	auto elapsed_seconds=end-start;
	std::cout<<"result:"<<result<<std::endl;
	std::cout<<"elasped seconds:"<<elapsed_seconds.count()<<std::endl;
}

三、配置及构建

1.配置

2.构建 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用CMake来构建和集成第三方。以下是一个简单的示例: 首先,确保你已经在项目中包含了你想要使用第三方的源代码或链接。 然后,在项目的根目录下创建一个CMakeLists.txt文件,并添加以下内容: ```cmake cmake_minimum_required(VERSION 3.0) project(YourProjectName) # 添加第三方的源代码或链接路径 add_subdirectory(thirdparty) # 添加你的项目源代码路径 add_subdirectory(src) ``` 在上述示例中,你需要将"YourProjectName"替换为你的项目名,并将"thirdparty"替换为你第三方的路径。 接下来,在第三方的目录下创建一个CMakeLists.txt文件,并在其中添加构建规则和选项。例如: ```cmake cmake_minimum_required(VERSION 3.0) project(ThirdPartyLibrary) # 添加源代码文件 add_library(ThirdPartyLibrary STATIC source1.cpp source2.cpp ) # 添加其他依赖项 target_link_libraries(ThirdPartyLibrary PUBLIC OtherLibrary PRIVATE SomeOtherLibrary ) ``` 在上述示例中,你需要将"ThirdPartyLibrary"替换为你的第三方名称,并将"source1.cpp"和"source2.cpp"替换为你的源代码文件。 最后,在你的项目源代码路径下创建一个CMakeLists.txt文件,并添加构建规则和选项。例如: ```cmake cmake_minimum_required(VERSION 3.0) project(YourProject) # 添加你的源代码文件 add_executable(YourProject main.cpp file1.cpp file2.cpp ) # 添加链接 target_link_libraries(YourProject PRIVATE ThirdPartyLibrary ) ``` 在上述示例中,你需要将"YourProject"替换为你的项目名称,并将"main.cpp"、"file1.cpp"和"file2.cpp"替换为你的源代码文件。 完成以上步骤后,你可以使用CMake来构建你的项目,并将第三方与你的代码一起编译。 请注意,这只是一个简单示例,实际的CMakeLists.txt文件可能更加复杂,根据你的项目需求和第三方的结构而有所不同。你需要根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值