CMake 编译并链接动态库

问题描述

目录结构如下:

|---CMP
	|---mmath
		|---mmath.h
		|---mmath.cpp
		|---CMakeLists.txt
	|---CMP.cpp
	|---CMakeLists.txt

需要把mmath子项目编译成动态链接库并被CMP.cpp调用

代码如下:

//mmath.h
namespace mmath {
int __declspec(dllexport) add(int a, int b);
}

注意:需要有__declspec(dllexport) 否则编译出来没有 .lib 文件,因为没有函数被导出

//mmath.cpp
#include "mmath.h"

int mmath::add(int a, int b) 
{
	return a * a + b * b;
}
//CMP.cpp
#include <iostream>
#include <mmath.h>

int main()
{
	std::cout << "add(3, 4) = " << mmath::add(3, 4) << std::endl;
	return 0;
}

CMakeLists.txt

mmath下的CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(mmath)

add_library(mmath mmath.cpp)

install(TARGETS mmath DESTINATION ${CMAKE_SOURCE_DIR}/build/lib
		RUNTIME DESTINATION ${CMAKE_SOURCE_DIR}/build/bin
)

install(FILES mmath.h DESTINATION ${CMAKE_SOURCE_DIR}/build/include)

CMP下的CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(CMP)

add_executable(${PROJECT_NAME} CMP.cpp)

add_subdirectory(${CMAKE_SOURCE_DIR}/mmath)

target_include_directories(CMP PRIVATE ${CMAKE_SOURCE_DIR}/build/include)

target_link_directories(CMP PRIVATE ${CMAKE_SOURCE_DIR}/build/lib)

target_link_libraries(CMP mmath)

install(TARGETS CMP RUNTIME DESTINATION ${CMAKE_SOURCE_DIR}/build/bin)

构建、编译、运行

以下命令均在CMP目录下完成

构建

  • cmake -S . -B build
    指定被构建目录和构建输出目录
    在这里插入图片描述
    此时CMP和mmath项目均被构建在CMP目录下的build中

编译

编译应遵循由下往上的原则,CMP需要链接mmath.lib,所以应先编译mmath目录

  • cmake --build .\build\mmath\ --config Release
    编译mmath
    在这里插入图片描述
  • cmake --install .\build\mmath\
    install mmath,将 .h 文件 和 编译出的lib、bin文件分别放入该放的地方
    在这里插入图片描述
  • cmake --build build --config Release
    在这里插入图片描述
  • cmake --install build
    在这里插入图片描述
    此时exe和dll正好在同一个目录下,可直接运行exe
    在这里插入图片描述
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
CMake是一个跨平台的编译工具,可以用于编译链接静态库和动态库。下面是使用CMake编译链接静态库和动态库的步骤: ## 编译静态库 1. 创建一个CMake项目,包含要编译的源代码文件和头文件。 2. 创建一个CMakeLists.txt文件,并添加以下代码: ``` # 设置项目名称和版本号 project(mylib VERSION 1.0) # 添加要编译的源代码文件 add_library(mylib STATIC src/mylib.cpp) # 将头文件目录添加到include路径中 target_include_directories(mylib PUBLIC ${PROJECT_SOURCE_DIR}/include) # 设置安装目录 install(TARGETS mylib DESTINATION lib) install(FILES include/mylib.h DESTINATION include) ``` 3. 在项目目录下创建一个build目录,进入该目录并运行以下命令: ``` cmake .. make ``` 4. 编译完成后,静态库文件将生成在build/lib目录下。 ## 编译动态库 1. 创建一个CMake项目,包含要编译的源代码文件和头文件。 2. 创建一个CMakeLists.txt文件,并添加以下代码: ``` # 设置项目名称和版本号 project(mylib VERSION 1.0) # 添加要编译的源代码文件 add_library(mylib SHARED src/mylib.cpp) # 将头文件目录添加到include路径中 target_include_directories(mylib PUBLIC ${PROJECT_SOURCE_DIR}/include) # 设置安装目录 install(TARGETS mylib DESTINATION lib) install(FILES include/mylib.h DESTINATION include) ``` 3. 在项目目录下创建一个build目录,进入该目录并运行以下命令: ``` cmake .. make ``` 4. 编译完成后,动态库文件将生成在build/lib目录下。 ## 链接静态库 1. 创建一个CMake项目,包含要编译的源代码文件和头文件。 2. 创建一个CMakeLists.txt文件,并添加以下代码: ``` # 设置项目名称和版本号 project(myapp VERSION 1.0) # 添加要编译的源代码文件 add_executable(myapp src/main.cpp) # 将头文件目录添加到include路径中 target_include_directories(myapp PUBLIC ${PROJECT_SOURCE_DIR}/include) # 添加静态库 add_library(mylib STATIC IMPORTED) set_target_properties(mylib PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/libmylib.a) target_link_libraries(myapp mylib) ``` 3. 在项目目录下创建一个build目录,进入该目录并运行以下命令: ``` cmake .. make ``` 4. 链接完成后,可执行文件将生成在build目录下。 ## 链接动态库 1. 创建一个CMake项目,包含要编译的源代码文件和头文件。 2. 创建一个CMakeLists.txt文件,并添加以下代码: ``` # 设置项目名称和版本号 project(myapp VERSION 1.0) # 添加要编译的源代码文件 add_executable(myapp src/main.cpp) # 将头文件目录添加到include路径中 target_include_directories(myapp PUBLIC ${PROJECT_SOURCE_DIR}/include) # 添加动态库 add_library(mylib SHARED IMPORTED) set_target_properties(mylib PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/libmylib.so) target_link_libraries(myapp mylib) ``` 3. 在项目目录下创建一个build目录,进入该目录并运行以下命令: ``` cmake .. make ``` 4. 链接完成后,可执行文件将生成在build目录下。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值