就像make clean删除makefile生成的所有文件一样,我也想用CMake做同样的事情。 我经常发现自己手动去除了像cmake_install.cmake和CMakeCache.txt CMakeFiles文件和CMakeFiles文件夹。 有像cmake clean的命令来自动删除所有这些文件? 理想情况下,这应该遵循当前目录的CMakeLists.txt文件中定义的recursion结构。
我正在考虑将Visual C ++,XCode和makefiles中的独立构buildpipe理系统的跨平台项目切换到CMake。 我需要的一个基本function是自动将目录中的所有文件添加到目标。 虽然这与make很容易做到,但使用Visual C ++和XCode并不容易(如果我错了,请纠正错误)。 是否可以直接在CMake中完成? 怎么样? 考虑到目前该项目是中型(8个库,2个可执行文件,8个testing项目,并且取决于大约8个外部库),在学习CMake之前,请随时添加其他任何我应该注意的事情。
我正在开发跨平台的C ++项目。 最初的想法是与msvc2010一起工作,随后在CMake和Hudson的帮助下为其他系统编译。 在演播室设置发生变化后,手动更改CMake文件似乎并不方便。 那么,最简单的方法是什么:为vcxproj和vcxproj.filters编写parsing器,还有另一个好的解决scheme?
我想在CMake中更改CMAKE_CXX_FLAGS_RELEASE或CMAKE_CXX_FLAGS_DEBUG的默认值。 基本上,我有一些项目的默认设置与CMake的不同(比如发布版本)略有不同,我不应该问自己:“哦,当添加add_compile_options时,它们的-O3或者-O2是否优先。 现在,我知道如何设置这些值,但我不知道如何使用户可以通过以下两种常用方式进行编辑:在命令行上使用DCMAKE_CXX_FLAGS_DEBUG=yourflags ,或者使用ccmake或CMakeSetup对其进行configuration。 问题是CMAKE设置和caching它们自己的默认值,如果你不使用FORCE来覆盖variables,那么“默认值”是不会改变的。 如果在我的set命令中使用FORCE: set(CMAKE_CXX_FLAGS_DEBUG blah CACHE STRING "" FORCE) ,每次脚本运行时都会覆盖它,消除了用户如果希望更改它的可能性。 我设法通过执行以下操作来破解它与CCMAKE一起工作,但是这仍然不能与cmake -DCMAKE_CXX_FLAGS_DEBUG因为它会在完成之后覆盖用户更改: set(DEFAULTS_SET FALSE CACHE BOOL "") set(CMAKE_CXX_FLAGS_DEBUG "-this -that" CACHE STRING "" FORCE) set(DEFAULTS_SET TRUE CACHE BOOL "" FORCE) 显然,这是一个讨厌的黑客攻击,并不完全工作(在cmake的情况下 – 这是什么= thisorthat)。 我也可以添加其他的构buildtypes,但是我不明白为什么只需要改变一些简单的东西就可以。 编辑2015年3月1日: 我已经创build了一个可行的解决scheme,但是我仍然对我所要做的事情不感到兴奋。 我看过其他的解决设置CMAKE_CXX_FLAGS_DEBUG和朋友的问题,但是这个解决scheme对我来说并不适用,因为我试图根据正在使用的编译器来select它们。 编译器不确定,但是,直到它已经填充我的variables。 我使用的技巧如下。 在项目命令之前,必须将标志variables设置为“特殊”。 set(CMAKE_CXX_FLAGS_DEBUG "_UNSET" CACHE STRING "") project(your_project C CXX) if(${CMAKE_CXX_FLAGS_DEBUG} STREQUAL "_UNSET") […]
当使用CMake进行交叉编译时,通常通过CMAKE_TOOLCHAIN_FILE选项指定一个工具链文件。 在GNU术语中 ,可以使用这个文件指定主机体系结构工具集。 但是,通常不能期望能够执行任何使用该工具链构build的任何东西。 因此,经常需要为构build体系结构编译一些构build工具。 考虑以下设置。 我有两个源文件genfoo.c和bar.c 在构build过程中,需要编译并运行genfoo.c 。 它的输出需要写入foo.h 然后我可以编译bar.c ,其中#include "foo.h" 。 由于CMake默认使用主机架构工具链,所以bar.c的说明很简单。 但是,我如何告诉它使用构build体系结构工具链来编译genfoo.c ? 简单地说add_executable(genfoo genfoo.c)将导致使用错误的编译器。
我正在CMake中尝试CTest,以便使用make test target自动运行我的一些make test 。 问题是CMake不能“理解”我愿意运行的testing必须被build立,因为它是项目的一部分。 所以我正在寻找一种方法来显式指定这个依赖。
我第一次写CMakemacros,而且我很难理解variables是如何工作的。 最具体地说,$ {a}似乎与“$ {a}”有不同的含义。 例如这里: 将一个列表传递给一个cmakemacros 我不明白什么时候应该加引号,什么是更大的基本原则。
我们使用CMake在我们的SVN中生成源代码的Visual Studio文件。 现在我的工具需要一些DLL文件与可执行文件在同一个文件夹中。 DLL文件位于源文件夹旁边。 我怎样才能改变我的CMakeLists.txt ,使生成的Visual Studio项目已经在释放/debugging文件夹中的特定DLL文件,或将编译时复制它们?
如果编译器支持C ++ 11,有没有办法让cmake自动检测? 因为在cmake运行期间通知用户将不会编译代码,因为编译器不支持C ++ 11。 此刻,我设置了C ++ 11标志,但是如果编译器不支持它,用户在cmake运行期间将得到编译错误而不是错误。 完美会像find_package()那样工作,但是我还没有find任何提供所需function的函数模块。 另外,如果编译器需要标记std=c++0x或std=c++11那么这个function将会很好。 有没有可用的东西,还是我需要自己开发? 这里有一些代码我使用到目前为止,但它只适用于GNU gcc编译器。 如果会有更通用的解决scheme,那将会很好。 if(CMAKE_COMPILER_IS_GNUCXX) execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) if (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7) message(STATUS "C++11 activated.") add_definitions("-std=gnu++11") elseif(GCC_VERSION VERSION_GREATER 4.3 OR GCC_VERSION VERSION_EQUAL 4.3) message(WARNING "C++0x activated. If you get any errors update to a compiler which fully supports […]
我需要添加boost库到我的CMakeLists.txt。 你怎么做,或者如何添加它?