Cmake 实现debug和release lib依赖项处理
一、说明
最近用cmake开发东西,编译vs时候,发现debug和release版本的lib库的依赖项问题,故此小结一下。若有不对之处,还请看官多多指教。
使用的工程有自己编写的工程,也有借用第三方库的工程,还有没有办法找到源码的,只有dll和lib库,没有区分debug和release 版本的。
所以还是分开说,一种自己工程库,一种是第三方库。在写完cmake代码,生成vs后,都可以自动的添加链接库,debug和release版本泾渭分明。
二、自己工程之间的引用
先说,自己编写的工程,工程直接的相互调用,这个就不用多说了。Cmake还是要调用target_link_libraries来链接自己的想要链接的动态库。
但是需用做些设置,就可以自动的区分debug和release版本了。
首先,需实现cmake定义如下:
#这个就是定义各个版本对应的后缀,例如d,debug版本后缀,当然你想定义为其他, #自己修改这块就可以了。
SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually d on windows")
SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
SET(CMAKE_RELWITHDEBINFO_POSTFIX "rd" CACHE STRING "add a postfix, usually empty on windows")
SET(CMAKE_MINSIZEREL_POSTFIX "s" CACHE STRING "add a postfix, usually empty on windows") # Set the build postfix extension according to what configuration is being built.
IF (CMAKE_BUILD_TYPE MATCHES "Release")
SET(CMAKE_BUILD_POSTFIX "${CMAKE_RELEASE_POSTFIX}")
ELSEIF (CMAKE_BUILD_TYPE MATCHES "MinSizeRel")
SET(CMAKE_BUILD_POSTFIX "${CMAKE_MINSIZEREL_POSTFIX}")
ELSEIF(CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo")
SET(CMAKE_BUILD_POSTFIX "${CMAKE_RELWITHDEBINFO_POSTFIX}")
ELSEIF(CMAKE_BUILD_TYPE MATCHES "Debug")
SET(CMAKE_BUILD_POSTFIX "${CMAKE_DEBUG_POSTFIX}")
ELSE()
SET(CMAKE_BUILD_POSTFIX "")
ENDIF()
以上代码我们是在外层的CMakeLists.txt中实现的。
接着下来cmake代码是在内层的cMakeLists.txt中实现。主要是使用外层定义的东西。
Cmake代码如下:
# Set the library extension according to what configuration is being built.
IF(CMAKE_DEBUG_POSTFIX)
SET(CMAKE_CXX_FLAGS_DEBUG
"${CMAKE_CXX_FLAGS_DEBUG} -DRW_LIBRARY_POSTFIX=${CMAKE_DEBUG_POSTFIX}")
ENDIF()
IF(CMAKE_RELEASE_POSTFIX)
SET(CMAKE_CXX_FLAGS_RELEASE
"${CMAKE_CXX_FLAGS_RELEASE} -DRW_LIBRARY_POSTFIX=${CMAKE_RELEASE_POSTFIX}")
ENDIF()
IF(CMAKE_RELWITHDEBINFO_POSTFIX)
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO
"${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DRW_LIBRARY_POSTFIX=${CMAKE_RELWITHDEBINFO_POSTFIX}")
ENDIF()
IF(CMAKE_MINSIZEREL_POSTFIX)
SET(CMAKE_CXX_FLAGS_MINSIZEREL
"${CMAKE_CXX_FLAGS_MINSIZEREL} -DRW_LIBRARY_POSTFIX=${CMAKE_MINSIZEREL_POSTFIX}")
ENDIF()
其中的RW_LIBRARY_POSTFIX是我们工程相关的名称,你们可以自己设置。在工程属性的出现,如下所示:
三、第三方库
关于第三方库,情况比较复杂。有源码的,没有源码的,静态的,动态的,只有release,没有debug的。我们现在做的是要求,至少有release版本的的lib库。如没有就不会添加到所需的工程的依赖项中。
因为第三方库,在项目组中,各自的工程各自知道需用什么第三方库,所以就写了一个cmake的宏定义来实现。
下面是cmake原文代码:
#link library for debug and release by yourself.
MACRO(RW_LINK_LIBRARY BASE_LIBRARY_NAME DEBUGSUFFIX EXSUFFIX)
set(DEBUG_LIB ${PROJECT_SOURCE_DIR}/${BASE_LIBRARY_NAME}${DEBUGSUFFIX})
set(RELEASE_LIB ${PROJECT_SOURCE_DIR}/${BASE_LIBRARY_NAME}${EXSUFFIX})
IF(EXISTS ${RELEASE_LIB})
<span style="white-space:pre"> </span>target_link_libraries(${PROJECT_NAME} optimized ${RELEASE_LIB})
<span style="white-space:pre"> </span>IF(EXISTS ${DEBUG_LIB})
<span style="white-space:pre"> </span> target_link_libraries(${PROJECT_NAME} debug ${DEBUG_LIB})
<span style="white-space:pre"> </span>ELSE()
<span style="white-space:pre"> </span> target_link_libraries(${PROJECT_NAME} debug ${RELEASE_LIB})
<span style="white-space:pre"> </span>ENDIF(EXISTS ${DEBUG_LIB})
ENDIF(EXISTS ${RELEASE_LIB})
ENDMACRO() MACRO(RW_LINK_3RD_PART_LIBRARY FULL_LIBRARY_DEBUGNAME FULL_LIBRARY_RELEASENAME)
IF(EXISTS ${FULL_LIBRARY_RELEASENAME})
target_link_libraries(${PROJECT_NAME} optimized ${FULL_LIBRARY_RELEASENAME})
IF(NOT EXISTS ${FULL_LIBRARY_DEBUGNAME})
target_link_libraries(${PROJECT_NAME} debug ${FULL_LIBRARY_RELEASENAME})
ELSE()
target_link_libraries(${PROJECT_NAME} debug ${FULL_LIBRARY_DEBUGNAME})
ENDIF(NOT EXISTS ${FULL_LIBRARY_DEBUGNAME})
ENDIF(EXISTS ${FULL_LIBRARY_RELEASENAME})
ENDMACRO()
宏的使用方式为:
第一个宏的使用在对应的工程下,lib库可以写相对路径。
RW_LINK_LIBRARY(free_image/FreeImage "d.lib" ".lib")
第一个参数为含路径名称的lib库名称,后面分别为debug和release版本的区分。
此定义还不是很完善,以后可能修改为只添加不同的部分,比如:
RW_LINK_LIBRARY(free_image/FreeImage "d" "") 内部自动来识别andriod 或ios或msvc等。
第二个宏的用法为:
RW_LINK_3RD_PART_LIBRARY(${GDAL_LIBRARY_DEBUG} ${GDAL_LIBRARY})
其中里面写的是两个lib库的路径变量。
两个宏定义的原则均为,当没有debug版本的lib库时候,使用release版本的lib库。
ps:
Cmake也是边做边学,若有不足之处,还请多多包含。
其中,也有实现了功能,而不知所以的地方。
若有问题,请不吝指正。
Cmake 实现debug和release lib依赖项处理的更多相关文章
- cmake编译Debug和Release
CMake 中有一个变量 CMAKE_BUILD_TYPE ,可以的取值是 Debug Release Rel WithDebInfo 和 MinSizeRel.当这个变量值为 Debug 的时候,C ...
- Linking different libraries for Debug and Release builds in Cmake on windows?
问题叙述性说明: So I've got a library I'm compiling and I need to link different third party things in depe ...
- cmake引入第三方库的debug和release版本之Windows版本
概述 本文将介绍cmak引入第三方库debug和release不同配置. Windows上,习惯将debug模式下生成的动态库名后缀添加D 以作和release区分.cmake创建一个项目A,A引入动 ...
- OpenCV在debug和release模式下选择不同的lib静态库文件
这两天测试OpenCV显示到MFC的Picture控件上,终于测试成功了,但是换到release模式下就会imread失败.发现问题是导入的lib问题. 因为VS如果通过Property Manage ...
- Visual Studio添加lib到链接依赖项的几种方法
使用第三方库文件编写应用时经常会出现链接错误: 错误 22 error LNK2019: 无法解析的外部符号..... 该符号在函数.....在....中被引用 出现这个错误的原因很简单,链接器在將库 ...
- OpenCV:Debug和Release模式 && 静态和动态编译
1.Release和Debug的区别 Release版称为发行版,Debug版称为调试版. Debug中可以单步执行.跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢.Release版运行速度较 ...
- C++中debug和release的区别 . 转载
vc中debug和release的不同 收藏 在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当 ...
- Debug与Release版本的区别详解
原文链接 Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动.如果我们愿意,我们完全可以把Debug和Release的行为完全颠 ...
- Debug与Release版本的区别
Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动.如果我们愿意,我们完全可以把Debug和Release的行为完全颠倒过来.当 ...
随机推荐
- 43.安装npm及cnpm(Windows)
转自:https://www.cnblogs.com/yominhi/p/7039795.html [工具官网] Node.js : http://nodejs.cn/ 淘宝NPM: https:// ...
- 34.Intellij IDEA 安装lombok及使用详解
转自:https://blog.csdn.net/qinxuefly/article/details/79159018 项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set ...
- css相关用法
1. 2. 3.offset([coordinates]) 获取匹配元素在当前视口的相对偏移. 返回的对象包含两个整型属性:top 和 left,以像素计.此方法只对可见元素有效. a.获取当前元素的 ...
- 【习题 8-2 UVA-1610】Party Games
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 字符串排序后 显然是n/2-1和n/2这两个字符串进行比较. 设为a,b 找到第一个不相同的位置. 即0..i-1是相同的前缀,然后 ...
- 分享一段php获取随意时间的前一天代码
<?php /** * 获取给定日期的前一天 * @param string $date * @return string $yesterday */ function getYesterday ...
- 74.sscanf数据扫描
"%[0-9A-Za-z] 读取一个集合,遇到不是数组或者大小写字母跳出 %*[^0-9A-Za-z]读取所有的非数字字母的字符,忽略 示例: ]= "123sadsadasd ...
- php基础篇之一
1.PHP是什么 官方文档:超文本预处理器 2.PHP能够做一些什么? PHP主要应用在一下领域: (1)服务器端脚本,需要:PHP解析器,PHP服务器,PHP浏览器. (2)命令行脚本,只需要PHP ...
- Spring.net的Demo项目,了解什么是控制反转
Spring这个思想,已经推出很多年了. 刚开始的时候,首先是在Java里面提出,后来也推出了.net的版本. Spring里面最主要的就是控制反转(IOC)和依赖注入(DI)这两个概念. 网上很多教 ...
- OrmLite使用小结(一)
在使用OrmLite过程中,遇到了不少问题.鉴于中文文档比較少,看英文文档又不知道怎样看起.仅仅能遇到问题查找解决方法并整理出来,如有错误,希望能指正! ** 1.模糊条件查询 ** 使用条件查询时. ...
- RocketMQ(九):消息发送(续)
匠心零度 转载请注明原创出处,谢谢! RocketMQ网络部署图 NameServer:在系统中是做命名服务,更新和发现 broker服务. Broker-Master:broker 消息主机服务器. ...