我试图区分调试和发布版本.
如果调试构建过程中我想安装MYLIB d在/ usr/local/lib目录.如果正在发布版本,我想在/ usr/local/lib中安装myLib.
这是我的方法
IF(CMAKE_BUILD_TYPE MATCHES RELEASE)
SET(LIB_NAME myLib)
ELSE()
SET(LIB_NAME myLibd)
ENDIF(CMAKE_BUILD_TYPE MATCHES RELEASE)
ADD_LIBRARY(${LIB_NAME} ${Source_files} ${Header_files})
INSTALL(TARGETS ${LIB_NAME} DESTINATION /usr/local/lib)
Run Code Online (Sandbox Code Playgroud)
但是,目标名称在两种情况下(CMAKE_BUILD_TYPE = Debug或Release)始终是myLib d.这里有什么问题?
CMake 有多种构建类型,例如发布、调试、带有调试信息的发布和最小大小发布。我想知道用户是否可以添加其他构建类型(例如 Profile),以及这是否是其他程序员的众所周知的做法。
在此答案中,它说“调试”是默认的cmake构建配置。
但是我有不同的看法:
我在CMakeLists.txt中遵循以下命令,根据当前的构建配置选择lib的调试和发行版本。
target_link_libraries(MyApp debug Widgets_d)
target_link_libraries(MyApp optimized Widgets)
Run Code Online (Sandbox Code Playgroud)
似乎当我不分隔-DCMAKE_BUILD_TYPE标志而调用cmake时,将使用小部件而不是Widgets_d(当我删除小部件并尝试构建时,会抱怨lib不存在)。因此,这意味着默认情况下将优化构建配置,而不是调试。
那么,默认的构建配置到底是什么?如果是调试,我的CMakelists.txt可能是什么问题?
如何将项目特定变量传递到子目录?我想知道是否有"官方"方式这样做:
# (CMAKE_BUILD_TYPE is one of None, Debug, Release, RelWithDebInfo)
# ...
# set specific build type for 'my_library'
set( CMAKE_BUILD_TYPE_COPY "${CMAKE_BUILD_TYPE}" )
set( CMAKE_BUILD_TYPE "Release" )
add_subdirectory( "my_library" )
set( CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE_COPY} )
# continue with original build type
# ...
Run Code Online (Sandbox Code Playgroud)
库/子目录my_library应始终为buildt类型"Release",主项目和其他子目录应该是buildt,其类型由配置定义.我不能修改CMakeLists.txt的my_library.
我在 C++ 领域工作了很多年,但对 CMake 还很陌生。
我用构建我的应用程序
cmake --build build_dir --config Debug --target all -- -j 1
Run Code Online (Sandbox Code Playgroud)
这工作正常并构建调试版本。
如果我将 --config 更改为其他内容,例如使用以下命令发布:
cmake --build build_dir --config Release --target all -- -j 1
Run Code Online (Sandbox Code Playgroud)
忍者说“没有工作可做”并退出。运行编译后的应用程序,它显然没有得到优化。此 Cmake 项目中还有两个其他选项,RelWithDebug 和 MinSizeRel,它们的作用相同。
在CmakeLists.txt中有:
set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
Run Code Online (Sandbox Code Playgroud)
还有很多其他提到的各种类型,但目前对我来说都有点希腊语。
我该怎么做才能找出问题出在哪里?
我认为默认配置类型可以像这样描述:
Debug : w/ debug symbols, w/o optimization
Release : w/o debug symbols, w/ optimization
RelWithDebInfo : w/ debug symbols, w/ optimization
MinSizeRel : w/o debug symbols, w/ optimization, stripped binaries
Run Code Online (Sandbox Code Playgroud)
但我需要新的:
MyConf : w/o debug symbols, w/o optimization
Run Code Online (Sandbox Code Playgroud)
那么,如何创建呢?