问题描述
目录结构如下:
|---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