我开始使用CMake来构建我的c ++源文件,当我建立起来时,我看到一个奇怪的比较:
'cmake ../'将对目录结构进行gerate
'make'将构建所有
任何连续的make命令都不会像预期的那样构建任何内容
'cmake ../'显然什么都不做
'make'WILL REBUILD all
任何连续的make命令都不会像预期的那样构建任何内容
有我的CMakelists.txt:
cmake_minimum_required(VERSION 2.6)
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_CXX_FLAGS "-Wall -pipe")
set(var_target CommonBase)
set(var_path_source base)
project(Prj_${var_target})
file(GLOB_RECURSE var_sources ${var_path_source}/*.cpp)
add_library(${var_target} SHARED ${var_sources})
install(TARGETS ${var_target} DESTINATION ${PROJECT_SOURCE_DIR}/install)
看起来更好,首先'cmake ../'命令文件'CMakeFiles / CommonBase.dir / depend.make'为空,连续的make命令将插入文件依赖项列表
我的CMakelists.txt有问题吗?
由于
答案 0 :(得分:1)
这里有几个问题。
问题的实际原因是在<{em} set(CMAKE_CXX_FLAGS ...)
命令之前有project
行。
project
命令在第一次运行时执行了大量工作,并且实际上将此变量清除为副作用。因此,在第一次运行CMake时,编译器标志为空,然后始终包含set
它们的内容。 (这是你第二次运行CMake导致make重新编译所有,而不是后续的CMake运行。)
尝试使用project
包裹您的message
来看效果:
message("CMAKE_CXX_FLAGS - ${CMAKE_CXX_FLAGS}")
project(Prj_${var_target})
message("CMAKE_CXX_FLAGS - ${CMAKE_CXX_FLAGS}")
删除您的CMakeCache.txt文件(在您的构建根目录中),然后重复运行cmake ..
。
要解决此问题,请将set(CMAKE_CXX_FLAGS ...)
移至project
命令之后。
第二个问题是不建议在CMakeLists.txt中设置CMAKE_CXX_COMPILER
。请查看“Setting default compiler in CMake”下方的评论,以及CMake常见问题解答条目How do I use a different compiler?