Cmake vs制作示例代码?

我想知道是否有任何Makefilemake )和CMakeLists.txtcmake )的代码都做同样的事情(唯一的区别是一个是写在make和另一个在cmake )。

我试图寻找'cmake vs make',但我从来没有find任何代码比较。 理解差异是非常有用的,即使只是一个简单的例子。

以下Makefile从源prog1.c, prog2.c, prog3.c and main.c构build一个名为prog的可执行文件。 proglibmystatlib.alibmydynlib.so链接,这两者都是从源代码构build的。 另外, progstuff/lib使用库libstuff.a ,在stuff/include它的头文件。 Makefile默认构build一个发布目标,但也提供一个debugging目标:

 #Makefile CC = gcc CPP = g++ RANLIB = ar rcs RELEASE = -c -O3 DEBUG = -c -g -D_DEBUG INCDIR = -I./stuff/include LIBDIR = -L./stuff/lib -L. LIBS = -lstuff -lmystatlib -lmydynlib CFLAGS = $(RELEASE) PROGOBJS = prog1.o prog2.o prog3.o prog: main.o $(PROGOBJS) mystatlib mydynlib $(CC) main.o $(PROGOBJS) $(LIBDIR) $(LIBS) -o prog debug: CFLAGS=$(DEBUG) debug: prog mystatlib: mystatlib.o $(RANLIB) libmystatlib.a mystatlib.o mydynlib: mydynlib.o $(CPP) -shared mydynlib.o -o libmydynlib.so %.o: %.c $(CC) $(CFLAGS) $(INCDIR) $< -o $@ %.o: %.cpp $(CPP) $(CFLAGS) $(INCDIR) -fPIC $< -o $@ 

下面是一个CMakeLists.txt (几乎)完全一样的,有一些注释强调了与Makefile的相似之处:

 #CMakeLists.txt cmake_minimum_required(VERSION 2.8) # stuff not directly project(example) # related to building include_directories(${CMAKE_SOURCE_DIR}/stuff/include) # -I flags for compiler link_directories(${CMAKE_SOURCE_DIR}/stuff/lib) # -L flags for linker set(PROGSRC prog1.c prog2.c prog3.c) # define variable add_executable(prog main.c ${PROGSRC}) # define executable target prog, specify sources target_link_libraries(prog mystatlib mydynlib stuff) # -l flags for linking prog target add_library(mystatlib STATIC mystatlib.c) # define static library target mystatlib, specify sources add_library(mydynlib SHARED mydynlib.cpp) # define shared library target mydynlib, specify sources #extra flags for linking mydynlib set_target_properties(mydynlib PROPERTIES POSITION_INDEPENDENT_CODE TRUE) #alternatively: #set_target_properties(mydynlib PROPERTIES COMPILE_FLAGS "-fPIC") 

在这个简单的例子中,最重要的区别是:

  • CMake可以识别哪些编译器用于哪种源。 而且,它为每种types的目标调用正确的命令序列。 因此,没有像$(CC)…,$(RANLIB)等命令的明确说明。

  • 处理包含头文件,库等的所有通常的编译器/链接器标志被独立于平台/独立于系统的独立命令取代。

  • debugging标志包括通过将variablesCMAKE_BUILD_TYPE设置为“debugging”,或通过调用程序时将其传递给CMake: cmake -DCMAKE_BUILD_TYPE:STRING=Debug

  • CMake还提供了平台独立的“-fPIC”标志(通过POSITION_INDEPENDENT_CODE属性)和其他许多标志。 尽pipe如此,更复杂的设置可以通过CMake和Makefile(通过使用COMPILE_FLAGS和类似的属性) COMPILE_FLAGS 。 当第三方库(如OpenGL)被包含在一个便携的方式当然CMake真的开始发光。

  • 如果您使用Makefile,构build过程只需一步即在命令行inputmake 。 对于CMake,有两个步骤:首先,您需要设置您的构build环境(通过在构build目录中键入cmake <source_dir>或通过运行某个GUI客户端)。 这会创build一个Makefile或类似的东西,具体取决于您select的构build系统(例如,在Unix或VC ++或Windows上的MinGW + Msys上创build)。 构build系统可以作为parameter passing给CMake; 但是,CMake会根据您的系统configuration进行合理的默认select。 其次,您在选定的构build系统中执行实际构build。

资源和构build说明可在https://github.com/rhoelzel/make_cmake获得; 。

抓取一些使用CMake作为构build系统的软件(有很多开源项目可供select)。 获取源代码并使用CMake进行configuration。 阅读结果makefile并享受。

有一件事要记住,这些工具并不是一一对应的。 最明显的区别是CMake扫描不同文件(例如C头文件和源文件)之间的依赖关系,而make则把它留给makefile作者。