在没有IDE的窗口上使用cmake

时间:2019-02-15 21:43:38

标签: c++ windows cmake

这可能是重复的,但是我已经花了几个小时来寻找答案……没有解决方案。首先,我知道如果使用Linux,则可能不存在此问题,但我使用的是Windows。

我对C ++还是很陌生,但是已经对Java和gradle有一定的经验。我尝试使用cmake,就像我习惯使用gradle一样。我已经阅读了cmake Wiki,但是我找不到正确的页面,或者只是我听不懂。这是我的目录结构:

MyProject
-bin
-include
--header1.h
--header2.h
--header3.h
--header4.h
--header5.h
--header6.h
-src
--CMakeLists.txt
--MyProjectConfig.h.in
--impl1.cpp
--impl2.cpp
--impl3.cpp
--impl4.cpp
--impl5.cpp
--impl6.cpp
-main.cpp
-CMakeLists.txt

我在项目文件夹中的CMakeLists.txt如下:

cmake_minimum_required (VERSION 3.14)

project (MyProject)
add_subdirectory(src)

file(GLOB_RECURSE sources      src/*.cpp include/*.h)

# The version number.
set (Tutorial_VERSION_MAJOR 0)
set (Tutorial_VERSION_MINOR 1)


# configure a header file to pass some of the CMake settings
# to the source code
configure_file (
  "${PROJECT_SOURCE_DIR}/MyProjectConfig.h.in"
  "${PROJECT_BINARY_DIR}/MyProjectConfig.h"
  )

# add the binary tree to the search path for include files
# so that we will find MyProjectConfig.h
include_directories("${PROJECT_BINARY_DIR}")  

install (FILES "${PROJECT_BINARY_DIR}/MyProjectConfig.h"        
         DESTINATION include)

add_executable(MyProject main.cxx ${sources})

# add the install targets
install (TARGETS MyProject DESTINATION bin)

我src文件夹中的CMakeLists.txt看起来像:

cmake_minimum_required (VERSION 3.14)

include_directories(${MyProject_SOURCE_DIR}/MyProject/include)

我在bin bin目录中使用命令:cmake -G "MinGW Makefiles" -S ../src

我现在有2个问题:

  1. (我如何告诉cmake始终使用MinGW?(我不想一直使用-G))已解决
  2. (编译后的文件build\CMakeFiles\3.14.0-rc2\CompilerIdCXX\a.exe没有预期的行为。它应该打印“ Hello world!”和“ My Class”,而“ My Class”是从{{ 1}},但是它什么也不做。)需要澄清: 如何构建Windows .exe文件以在控制台上破坏?

编辑:

我了解到创建cmake文件后必须在bin目录中调用impl1.cpp。但是我只是没有得到一个exe文件。使用标志-v,我得到以下输出:

cmake --build .

1 个答案:

答案 0 :(得分:0)

  1. 使用-G选项是执行此操作的标准方法。它使您不必将系统特定的设置放入CMake配置中(如MingW的硬编码路径),并使您可以使用其他编译器而不必更改构建脚本。
  2. 您启动的a.exe不是您的构建输出。它应该称为MyProjectExec.exe。另外,您需要在对add_executable的调用中指定所有源文件。 add_subdirectory不会自动添加任何源文件(应该将其添加到哪个构建输出中?),它只是执行CMakeLists.txt。