【cmake实战七】如何使用编译的库(动态库dll)2——windows系统
一、文件和目录
1、main.cpp
#include<iostream>
#include<windows.h>
#include "./haha/haha.h"
using namespace std;
int main()
{
cout<<"hello world"<<endl;
haha();
return 0;
}
2、CmakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.8.0)
PROJECT(NEWHELLO)
ADD_EXECUTABLE(hello main.cpp)
ADD_SUBDIRECTORY(haha)
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/haha") #要到haha目录,否则找不到
TARGET_LINK_LIBRARIES(hello haha) #会生成haha.lib链接到haha.dll,和静态生成的haha.lib不同,并非真正的静态库
SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")
SET(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")
3、haha
#ifndef HAHA_H
#define HAHA_H
#include<iostream>
extern "C" __declspec(dllexport) void haha();
#endif
#include "haha.h"
using namespace std;
void haha()
{
cout<<"haha"<<endl;
}
CMAKE_MINIMUM_REQUIRED(VERSION 3.8.0)
SET(TARGET "haha")
#ADD_LIBRARY(haha STATIC haha.cpp)
ADD_LIBRARY(haha SHARED haha.cpp)
SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")
SET(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")
二、构建、编译、运行
1、构建(新建build目录,在build目录下执行)
cmake ..
2、编译
devenv.com NEWHELLO.sln /Build "Debug|x64"
3、运行
.\hello.exe
三、知识讲解
1、动态库的两种调用方式
2、如何证明隐式调用真的调用了haha.dll