[✔️]CMake 在Windows上copy dll

简介: [✔️]CMake 在Windows上copy dll

file命令在Windows上的目录问题


file(GLOB ffmpeg_shared_libries ${FFMPEG_DEV_ROOT}/bin/*dll)
file(COPY ${ffmpeg_shared_libries} DESTINATION ${EXECUTABLE_OUTPUT_PATH})

以上的逻辑,在mac上,的确会将dll复制到对应的目录,但是在Windows上目录结构会变成这样:


  • EXECUTABLE_OUTPUT_PATH


  • Debug


  • Release


  • *.dll


在Windows上编译工程时,EXECUTABLE_OUTPUT_PATH等目录会自动在后边追加Debug/Release,当我们要copy文件时,因为这一层目录的原因,就会非常麻烦,因为cmake中是无法感知到这个目录的。


解决办法


在Windows上,通过add_custom_commandvs的宏变量巧妙解决,算是取巧:


add_custom_command(TARGET ${APP_NAME} PRE_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_directory ${COCOS2DX_ROOT_PATH}/xxx $(outdir)


就是这个$(out),注意是(),这个目录在vs中是一个宏变量,是指向exe的生成目录的。


再通过COMMADN copyCOMMAND copy-directory,就解决文件copy的问题。


区分debug、release


有时候我们还希望针对不同的编译模式,COMMAND也不同,最常见的场景就是debug、release。


之前我尝试在CMAKE中使用CMAKE_BUILD_TYPE,其实是没有任何效果的,因为这个cmake生成的vs工程中其实已经自带了debug、release模式,至于CMAKE_BUILD_TYPE和vs编译模式之间的关系,具体我也没搞明白。


这里就要借助CMAKE的生成器表达式,直接看CMAKE代码:


COMMAND "$<$<CONFIG:Release>:${CMAKE_COMMAND}>" "$<$<CONFIG:Release>:-E>" "$<$<CONFIG:Release>:copy_directory>"
"$<$<CONFIG:Release>:${CMAKE_CURRENT_LIST_DIR}/static/dll>" $(outdir)


大概的用法就是$<条件:值>,如果条件成立,那么就采用这个值,如果条件不成立,那么值就会被忽略,会被空字符串代替。生成器表达式也支持嵌套。


举例:


生成器表达式
$<1:foo> foo
$<0:foo>


而上边的CMAKE代码中,$<CONFIG:arg>是用来测试构建类型,如果arg对应的构建类型正在构建,那么它的的值就为TRUE



目录
相关文章
|
3月前
|
人工智能 机器人 编译器
【C++】Windows端VS code中运行CMake工程(手把手教学)
【C++】Windows端VS code中运行CMake工程(手把手教学)
|
3月前
|
存储 Java C语言
Windows 下 JNI 调用动态链接库 dll
Windows 下 JNI 调用动态链接库 dll
122 0
|
10月前
|
JSON 开发工具 C++
Windows下用CMake编译JsonCpp及配置(适合新手)
Windows下用CMake编译JsonCpp及配置(适合新手)
500 0
|
3月前
|
人工智能 机器人 编译器
【C++】Windows端VS code中运行CMake工程(手把手教学)
【C++】Windows端VS code中运行CMake工程(手把手教学)
208 0
|
6天前
|
XML C# 数据格式
绝密档案曝光!Windows平台如何深挖一个dll背后的神秘依赖,揭露隐藏的秘密!
【8月更文挑战第14天】在Windows系统中,动态链接库(DLL)对程序运行至关重要。了解DLL的依赖关系有助于软件的调试与优化。本文以具体案例演示如何查看DLL依赖。首先确保环境已安装Windows及具备基本开发知识。
15 0
|
3月前
|
存储 Java C++
Windows 下 JNA 调用动态链接库 dll
Windows 下 JNA 调用动态链接库 dll
94 0
|
3月前
|
SQL 关系型数据库 MySQL
Trinitycore学习之windows上用cmake生成vs项目并尝试在windows上启动服务
Trinitycore学习之windows上用cmake生成vs项目并尝试在windows上启动服务
99 0
|
3月前
|
计算机视觉 Windows
OpenCV + CLion在windows环境下使用CMake编译, 出现Mutex相关的错误的解决办法
OpenCV + CLion在windows环境下使用CMake编译, 出现Mutex相关的错误的解决办法
111 0
|
3月前
|
C++ Windows
CMake中的find_package(xxx REQUIRED)在windows平台怎么解
CMake中的find_package(xxx REQUIRED)在windows平台怎么解
108 0
|
8月前
|
网络协议 安全 API
9.9 Windows驱动开发:内核远程线程实现DLL注入
在笔者上一篇文章`《内核RIP劫持实现DLL注入》`介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的,本章将继续探索全新的注入方式,通过`NtCreateThreadEx`这个内核函数实现注入DLL的目的,需要注意的是该函数在微软系统中未被导出使用时需要首先得到该函数的入口地址,`NtCreateThreadEx`函数最终会调用`ZwCreateThread`,本章在寻找函数的方式上有所不同,前一章通过内存定位的方法得到所需地址,本章则是通过解析导出表实现。
111 0
9.9 Windows驱动开发:内核远程线程实现DLL注入