在GCC编译的项目中,
g++与一个嵌套库一起编译gcc?cmake -H. -Bbuild -G "MSYS Makefiles"
Run Code Online (Sandbox Code Playgroud)
该-H.选项在这里执行什么任务?cmake --help说-H打印帮助......
我正在使用CMake 3.2.3.
我想建立一个已经将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调用,还是有更好的选择?
我正在尝试为我的cmake构建添加一个自定义构建类型,目标是代码覆盖率.
但是,我无法使其发挥作用.
这是我的代码,使用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把中间文件,比如.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文档中找到任何列出默认情况下每个构建类型使用哪些编译器标志的内容,而我宁愿不发明自己的做事方式.
这个功能是否已经存在?如果不采用试验和错误,我如何确定默认情况下为各种构建类型使用哪些标志?
我正在使用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是构建生成器.这意味着它可以根据CMakeLists.txt的指令生成适当的构建(makefile,Visual Studio项目等).但我不明白我认为有两个相关的事情:
为什么cmake-gui中有两个按钮"Configure"和"Generate"?在我读过的命令行教程(例如这个)中,通常的过程是用一个cmake命令完成的.
什么是cmake世界的缓存?AFAIK是按下"配置"按钮时的状态,但未按下"生成"按钮.但为什么这有用呢?按"配置"后弹出的所有变量是什么意思?为什么我应该编辑它们?是不是唯一允许通过CMakeLists.txt完成的配置?
谢谢
我正在将一个项目从简单的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) 由于我无法从发布版本更改为调试版本类型,我想知道我做错了什么.我正在使用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之间改变的最佳位置是什么?