1

我开始使用 CMake 来构建我的 c++ 源文件,当我最初构建时,我看到了一个奇怪的说法:

'cmake ../' 将生成目录结构

'make' 将构建所有

正如预期的那样,任何连续的 make 命令都不会构建任何东西

'cmake ../' 显然什么都不做

'make' 将重建所有

正如预期的那样,任何连续的 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 有问题吗?

谢谢

4

1 回答 1

1

这里有几个问题。

问题的实际原因是命令set(CMAKE_CXX_FLAGS ...) 之前的行project

project命令在第一次运行时做了很多工作,实际上清除了这个变量作为副作用。因此,在您第一次运行 CMake 时,编译器标志为空,此后始终包含您set要使用的内容。(这只是您第二次运行 CMake,这会导致 make 重新编译所有,而不是 CMake 的后续运行)。

尝试用 s 包装您的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命令之后。

第二个问题是不建议CMAKE_CXX_COMPILER在 CMakeLists.txt 中设置。查看下面的评论“在 CMake 中设置默认编译器”,以及 CMake 的常见问题解答条目的链接如何使用不同的编译器?

于 2013-04-07T00:26:47.697 回答