生成动态库
// example.h
#pragma once
#include <iostream>
#ifdef EXAMPLE_EXPORTS
#define EXAMPLE_API __declspec(dllexport)
#else
#define EXAMPLE_API __declspec(dllimport)
#endif
class EXAMPLE_API MyClass
{
public:
MyClass();
~MyClass();
void memberFunction();
};
#include "example.h"
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
}
void MyClass::memberFunction()
{
std::cout << "111" << std::endl;
}
// CMakeLists.txt
# CMake最低版本要求
cmake_minimum_required (VERSION 2.0)
# 项目名称
project(ExampleLibrary)
# 设置编译器标准
set(CMAKE_CXX_STANDARD 11)
# 添加生成的DLL文件
add_library(example SHARED example.cpp example.h)
# 定义导出宏以控制导入导出
target_compile_definitions(example PRIVATE EXAMPLE_EXPORTS)
生成的动态库和静态库在build/Debug目录下
使用动态库
1、拷贝头文件和静态库到当前目录下
2、创建bin目录,在里面创建Debug目录,并把动态库拷贝到Debug目录下
// main.cpp
#include <iostream>
#include "example.h"
int main()
{
// 使用动态链接库中的类和函数
MyClass *myObject = new MyClass();
myObject->memberFunction();
delete myObject;
return 0;
}
// CMakeLists.txt
# CMake最低版本要求
cmake_minimum_required(VERSION 3.0)
# 项目名称
project(main)
# 设置编译器标准
set(CMAKE_CXX_STANDARD 11)
# 添加动态库路径
link_directories(${CMAKE_CURRENT_SOURCE_DIR})
# 添加生成的可执行文件
add_executable(main main.cpp)
# 查找动态库并链接
target_link_libraries(main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/example.lib)
# 指定输出目录
set_target_properties(main PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin
)
生成的的exe就在bin/Debug目录下
在命令行执行main.exe就会看到输出。
问题1:为什么要把动态库放在bin/Debug目录下
因为exe执行时需要找到动态库的路径,要么设置环境变量,要么拷贝到同级目录下。
问题2:修改动态库的代码之后还需要生成吗
不需要生成,修改动态库代码之后重新生成动态库,将动态库替换即可。