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 
#include 

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 DESTINATIION ${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
    指定被构建目录和构建输出目录
    CMake 编译并链接动态库_第1张图片
    此时CMP和mmath项目均被构建在CMP目录下的build中

编译

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

  • cmake --build .\build\mmath\ --config Release
    编译mmath
    CMake 编译并链接动态库_第2张图片
  • cmake --install .\build\mmath\
    install mmath,将 .h 文件 和 编译出的lib、bin文件分别放入该放的地方
    在这里插入图片描述
  • cmake --build build --config Release
    CMake 编译并链接动态库_第3张图片
  • cmake --install build
    CMake 编译并链接动态库_第4张图片
    此时exe和dll正好在同一个目录下,可直接运行exe
    在这里插入图片描述

你可能感兴趣的:(笔记,c++,开发语言)