Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake目标设置问题_Cmake - Fatal编程技术网

CMake目标设置问题

CMake目标设置问题,cmake,Cmake,想象一下以下情况: 我有“project”文件夹,在这个文件夹中我有“src”文件夹和两个文件“1.cpp”和“2.cpp”。 每个.cpp生成一个可执行文件。在cmake生成makefiles后,我希望能够执行以下操作: 指定我要生成可执行文件“1”或“2”或两者 指定我要在调试模式下生成所有可执行文件 指定我要在发布模式下生成所有可执行文件 指定我要在发布和调试模式下生成所有可执行文件 因此,我希望能够写出以下内容: (c) 做任何事 (c) 做任何事 (c) 把任何东西都放出来 (c

想象一下以下情况:

我有“project”文件夹,在这个文件夹中我有“src”文件夹和两个文件“1.cpp”和“2.cpp”。 每个.cpp生成一个可执行文件。在cmake生成makefiles后,我希望能够执行以下操作:

  • 指定我要生成可执行文件“1”或“2”或两者
  • 指定我要在调试模式下生成所有可执行文件
  • 指定我要在发布模式下生成所有可执行文件
  • 指定我要在发布和调试模式下生成所有可执行文件
因此,我希望能够写出以下内容:

  • (c) 做任何事
  • (c) 做任何事
  • (c) 把任何东西都放出来
  • (c) 使/任何东西都调试
  • (c) 制作/发布所有调试和发布的内容
实现这一目标的最佳方式是什么?
非常感谢

在根目录中需要一个顶级的CMakeLists.txt,它知道您的“src”目录(使用
add_子目录
)。然后在“src”中,您将需要另一个CMakeLists.txt,它指定如何编译可执行文件。这本身就可以说,例如:

make 1 2
至于调试/发布模式,可以通过变量
cmake\u BUILD\u TYPE
在cmake中指定。但我通常在顶层指示它调试或发布模式,如果没有指定变量:

IF( NOT CMAKE_BUILD_TYPE )
  SET( CMAKE_BUILD_TYPE Debug ) 
  SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG" )
ENDIF( NOT CMAKE_BUILD_TYPE )
编辑生成类型而不修改CMakeLists.txt的另一种方法是

make edit_cache

这将打开一个ncurses对话框,其中包含变量,
CMAKE\u BUILD\u TYPE

在cmake文件中或运行make时指定需要调试/发布模式是不常见的(如果cmake生成了一个包/tarball/任何东西,则可能不是真的-我还不需要它)。通常,在设置特定构建时,可以通过使用
CMAKE gui
指定
CMAKE\u build\u TYPE
来指定Release/Debug。您可以使用
if
检查构建类型,以基于cmake文件中的构建类型包括/排除项。我没有这样做,但我确实使用了
if(CMAKE\u HOST\u WIN32)
来避免在Linux上构建特定于WIN32的代码,原理是一样的。为了一次构建多个配置,我总是使用单独的构建树,并使用脚本在每个文件夹中调用make。我不认为这是个好方法,但它完成了任务。谢谢你的回复。我将发布另一个关于同时构建多个配置的问题。