【cmake实战六】如何使用编译的库(动态库dll)——windows系统_make windows下生成库-CSDN博客
基于以上文章,遇到的一些问题:
一、首先我用vs code 新建了一个项目:TEST
新增文件:CMakeList.txt
# 设置CMake的最低版本要求为3.8.0
CMAKE_MINIMUM_REQUIRED(VERSION 3.8.0)
# 设置C++标准为C++14
set(CMAKE_CXX_STANDARD 14)
# 添加一个子目录到构建过程中,该子目录包含构建动态链接库的相关CMake配置和源代码
add_subdirectory(src/dynamicLink/buildDynamicLink)
# 添加另一个子目录到构建过程中,该子目录包含使用已构建的动态链接库的相关CMake配置和源代码
add_subdirectory(src/dynamicLink/useDynamicLink)
二、新建文件夹:src 以及子文件夹:dynamicLink
1、建立子工程:buildDynamicLink,新增haha.h、haha.cpp、CMakeList.txt
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")
2、新建build文件,并在build文件夹下 使用命令 cmake..
3、vs 打开 sln文件(笨方法)
3、重新生成dll
4、建立子工程:useDynamicLink,新增main.cpp、CMakeLists.txt
#include<iostream>
#include<windows.h>
using namespace std;
void loadDll(const std::wstring& dllname, HMODULE& handle)
{
//handle = (handle_t)::LoadLibrary(dllname.c_str());
handle = (HMODULE)::LoadLibraryW(dllname.c_str());
}
bool freeDll(HMODULE& handle)
{
bool re = FreeLibrary(handle);
return re;
}
int main()
{
cout<<"hello world"<<endl;
//handle_t handle = nullptr;
HMODULE handle = nullptr;
loadDll(L"F:\\C236\\01_CYTools\\src\\dynamicLink\\buildDynamicLink\\lib\\Debug\\haha.dll", handle);
if (nullptr == handle)
{
cout << "fail to load dll" << endl;
}
cout << "sucess to load dll" << endl;
typedef void (*print)();
print hahafunc=(print)GetProcAddress(handle, "haha");
hahafunc();
bool re = freeDll(handle);
if (re)
{
cout << "success to unload dll" << endl;
}
return 0;
}
ps:注意修改路径
CMAKE_MINIMUM_REQUIRED(VERSION 3.8.0)
PROJECT(NEWHELLO)
ADD_EXECUTABLE(hello main.cpp)
SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")
SET(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")