Cmake vs制作示例代码?
我想知道是否有任何Makefile
( make
)和CMakeLists.txt
( cmake
)的代码都做同样的事情(唯一的区别是一个是写在make
和另一个在cmake
)。
我试图寻找'cmake vs make',但我从来没有find任何代码比较。 理解差异是非常有用的,即使只是一个简单的例子。
以下Makefile从源prog1.c, prog2.c, prog3.c and main.c
构build一个名为prog
的可执行文件。 prog
与libmystatlib.a
和libmydynlib.so
链接,这两者都是从源代码构build的。 另外, prog
在stuff/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过程只需一步即在命令行input
make
。 对于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作者。