相关疑难解决方法(0)

CMake中的调试与发布

在GCC编译的项目中,

  • 如何为每种目标类型(调试/发布)运行CMake?
  • 如何使用CMake指定调试和释放C/C++标志?
  • 我如何表示主要可执行文件将g++与一个嵌套库一起编译gcc

c c++ gcc cmake

390
推荐指数
6
解决办法
41万
查看次数

什么`-H`选项对CMake意味着什么?

这个关于CMake的前一个问题的答案显示了这个命令行:

cmake -H. -Bbuild -G "MSYS Makefiles"
Run Code Online (Sandbox Code Playgroud)

-H.选项在这里执行什么任务?cmake --help-H打印帮助......

我正在使用CMake 3.2.3.

cmake

35
推荐指数
2
解决办法
5665
查看次数

如何以跨平台的方式使用CMake ExternalProject_Add或替代方案?

我想建立一个已经将CMake作为我项目的CMake条带的一部分的第三方项目.ExternalProject_Add就是出于此目的,但我发现它只能用于特定的生成器,我想在很多平台上轻松工作.

例如,这里是zlib的外部项目添加脚本,它有自己的CMakeLists.txt:

set(USE_PROJECT_CMAKE_MODULE_PATH "-DCMAKE_MODULE_PATH=${MAKE_MODULE_PATH}")
ExternalProject_Add(ZLIB
                    SOURCE_DIR ${CMAKE_SOURCE_DIR}/external/zlib
                    DOWNLOAD_COMMAND ""
                    UPDATE_COMMAND ""
                    CMAKE_ARGS
                       -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
                       -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
                       -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
                       -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
                       ${USE_PROJECT_CMAKE_MODULE_PATH}
                    INSTALL_COMMAND "")

ExternalProject_Add_Step(ZLIB installInternally
                         COMMAND cd <BINARY_DIR> && make install
                         DEPENDEES install
                         ALWAYS 1)
ExternalProject_Get_Property(ZLIB install_dir)

if(UNIX)
    set(ZLIB_NAME libz)
else(UNIX)
    set(ZLIB_NAME zlib)
endif(UNIX)

add_library(zlib UNKNOWN IMPORTED)
set_property(TARGET zlib PROPERTY IMPORTED_LOCATION ${install_dir}/lib/${ZLIB_NAME}.a)
set(ZLIB_LIBRARIES zlib)
set(ZLIB_LIBRARIES_OPTIONAL ${ZLIB_LIBRARIES})
set(ZLIB_DIR ${install_dir} CACHE INTERNAL "zlib ROOT dir")
set(ZLIB_INCLUDE_DIRS ${install_dir}/include CACHE INTERNAL "zlib include dirs")
set(ZLIB_DEFINES "-msse2 -mfpmath=sse" CACHE INTERNAL "zlib defines")
Run Code Online (Sandbox Code Playgroud)

这个问题是它适用于make,但不适用于Xcode或Visual Studio.也许有一些方法可以将传递给我的项目的cmake构建命令转发给ExternalProject_Add.

如何以最小的代码复杂性以跨平台的方式编写ExternalProject_Add调用,还是有更好的选择?

cross-platform cmake external-project

32
推荐指数
1
解决办法
3万
查看次数

如何向cmake添加自定义构建类型?(定位制作)

我正在尝试为我的cmake构建添加一个自定义构建类型,目标是代码覆盖率.

我发现它的FAQ条目:http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_specify_my_own_configurations_.28for_generators_that_allow_it.29_.3F

但是,我无法使其发挥作用.

这是我的代码,使用cmake 2.8.5:

message("* Adding build types...")
if(CMAKE_CONFIGURATION_TYPES)
   list(APPEND CMAKE_CONFIGURATION_TYPES CodeCoverage)
   list(REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES)
   set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING
       "Add the configurations that we need"
       FORCE)
   message("  Available build types are now : ${CMAKE_CONFIGURATION_TYPES}")
else()
   message("  XXX custom build types are not allowed...")
endif()
Run Code Online (Sandbox Code Playgroud)

我得到"不允许XXX自定义构建类型......"...

cmake

17
推荐指数
1
解决办法
1万
查看次数

在CMake中设置中间文件(如.obj)的目录

我已经看到CMake把中间文件,比如.obj放在这样的目录中:

project.dir/sort/of/copy/of/source/directory
Run Code Online (Sandbox Code Playgroud)

有办法有这样的东西:

project.dir/Debug/ myfiles.obj    |--> for my debug
Run Code Online (Sandbox Code Playgroud)

project.dir/Release/ myfiles.obj    |--> for my release
Run Code Online (Sandbox Code Playgroud)

暂时,我使用2个单独的目录来生成每次我的库或可执行文件的Debug和release.在我有了平台之后......

是否有类似于CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE或CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ...

对于中间文件.obj?

我也尝试了/Fo但是当我使用这个FLAG时,Cmake覆盖了他的配置:

warning D9025 : overriding '/Fo;../x64/Debug/' with '/FoCMakeFiles\project.dir\src\project\main.cpp.obj'

请问有人有解决方案吗?

cmake

12
推荐指数
1
解决办法
4139
查看次数

使用cmake,如何确定每种构建类型的默认编译器标志?

我正在尝试配置我的构建系统,以便我的发布版本不包含额外的调试.但我无法在CMake文档中找到任何列出默认情况下每个构建类型使用哪些编译器标志的内容,而我宁愿不发明自己的做事方式.

这个功能是否已经存在?如果不采用试验和错误,我如何确定默认情况下为各种构建类型使用哪些标志?

cmake

11
推荐指数
1
解决办法
1万
查看次数

如何使用cmake标志为Release版本生成pdb文件?

我正在使用cmake生成可视化工作室解决方案.现在我想为Release版本生成pdb文件.(为什么?因为我希望有符号以防用户发现一些错误)

我尝试通过设置以下标志而不成功:

set(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "Build Types" FORCE)

IF(WIN32)

set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release")
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "/debug /INCREMENTAL")
set( CMAKE_SHARED_LINKER_FLAGS_RELEASE "/debug /INCREMENTAL")
set( CMAKE_MODULE_LINKER_FLAGS_RELEASE "/debug /INCREMENTAL")
set( CMAKE_CXX_FLAGS_RELEASE "/MD /Zi /O2 /Ob1 /D NDEBUG")
set( CMAKE_C_FLAGS_RELEASE "/MD /Zi /O2 /Ob1 /D NDEBUG")
ENDIF(WIN32)
Run Code Online (Sandbox Code Playgroud)

看起来Cmake忽略了这些集合:提前感谢您的帮助!

cmake visual-studio pdb-files visual-studio-2012

10
推荐指数
2
解决办法
8292
查看次数

当CLI在一个命令中执行所有操作时,为什么GUI配置和生成中有两个按钮

我知道cmake是构建生成器.这意味着它可以根据CMakeLists.txt的指令生成适当的构建(makefile,Visual Studio项目等).但我不明白我认为有两个相关的事情:

  1. 为什么cmake-gui中有两个按钮"Configure"和"Generate"?在我读过的命令行教程(例如这个)中,通常的过程是用一个cmake命令完成的.

  2. 什么是cmake世界的缓存?AFAIK是按下"配置"按钮时的状态,但未按下"生成"按钮.但为什么这有用呢?按"配置"后弹出的所有变量是什么意思?为什么我应该编辑它们?是不是唯一允许通过CMakeLists.txt完成的配置?

谢谢

cmake cmake-gui

9
推荐指数
1
解决办法
2312
查看次数

CMake行为:使用Visual Studio的自定义配置类型需要多次cmake运行才能正确显示.这是有意的吗?

语境:

我正在将一个项目从简单的Makefiles迁移到CMake,以添加对多个编译器(gfortran + ifort)和操作系统(Windows + Linux)的支持.当我完成整个过程时,我正在尝试简化CMake行为并为用户提供一些额外的功能.

在对可能的操作系统和使用的编译器组合进行规范化和调整编译器选项之后,添加用户定义的构建类型"DEBUGVERBOSE"并启用所有检查和警告似乎是合理的.因为我们正在处理非常古老的Fortran 77代码,所以这些设置会生成> 3000个警告,这就是为什么我不想在标准的Debug构建类型中包含所有警告的原因.对于将来的代码清理和调试,它似乎是合适的.


问题:

我想将这个用户定义的构建类型"DEBUGVERBOSE"添加到Visual Studio 2012中的可用配置列表中.同时我想摆脱cmake生成的构建类型"MinSizeRel"和"RelWithDebInfo"来简化用户界面(因为我们从不使用这些配置).

根据CMake-Wiki - 如何使用定制的扩展构建模式?我按如下方式设置我的构建类型:

# Set Project Name and supported Languages(optional)
project (s4 Fortran C)
# Set Version Number
set (S4_VERSION_MAJOR 1)
set (s4_VERSION_MINOR 0)

# Set Source Language
enable_language (Fortran)

...

if(WIN32)
  # Release flags
  set(CMAKE_Fortran_FLAGS_RELEASE " ${CMAKE_Fortran_FLAGS_RELEASE} /D__WIN_intel__ /assume:byterecl")
  # Debug Flags
  set(CMAKE_Fortran_FLAGS_DEBUG " ${CMAKE_Fortran_FLAGS_DEBUG} /D__WIN_intel__ /assume:byterecl /Od /warn:all /check:all
                                                              /warn:notruncated_source /warn:nodeclarations /warn:nounused") 
  # verbose Debug flags (user-defined build type)
  set(CMAKE_Fortran_FLAGS_DEBUGVERBOSE  " /debug:full /dbglibs …
Run Code Online (Sandbox Code Playgroud)

cmake visual-studio visual-studio-2012

6
推荐指数
1
解决办法
3810
查看次数

使用biicode cmake在调试模式下构建c ++

由于我无法从发布版本更改为调试版本类型,我想知道我做错了什么.我正在使用Unix Makefiles.

在docs.biicode.com/c++/building.html中说明如何在CMakeLists.txt中添加SET()将变量添加到cmake.

我是cmake和biicode的新手,我尝试了以下所有方法:

ADD_DEFINITIONS(-DCMAKE_BUILD_TYPE=Debug)
ADD_DEFINITIONS(-DCMAKE_BUILD_TYPE:STRING=Debug)
SET(CMAKE_BUILD_TYPE Debug)
target_compile_options(my_program PUBLIC $<$<CONFIG:Debug>:-Werror>)
Run Code Online (Sandbox Code Playgroud)

但是gdb说"找不到调试符号".

另一种方式,作为状态bii --help cpp,传递给cpp:build参数,这些参数将传递给cmake,但是调用

bii cpp:build -DCMAKE_BUILD_TYPE=Debug
Run Code Online (Sandbox Code Playgroud)

产量

Building: cmake --build . -DCMAKE_BUILD_TYPE=Debug
Unknown argument -DCMAKE_BUILD_TYPE=Debug
Run Code Online (Sandbox Code Playgroud)

但直接打电话

cmake -DCMAKE_BUILD_TYPE=Debug --build .
Run Code Online (Sandbox Code Playgroud)

工作正常,我不知道如何更改命令中的顺序bii cpp:build.

这是一个误解,一个sintax错误,还是一定有其他错误?在Debug和Release之间改变的最佳位置是什么?

c++ cmake biicode

6
推荐指数
1
解决办法
484
查看次数