gpt4 book ai didi

makefile - Cmake 与 make 示例代码?

转载 作者:行者123 更新时间:2023-12-03 04:39:56 25 4
gpt4 key购买 nike

我想知道是否有 Makefiles (make) 和 CMakeLists.txt (cmake),两者都做同样的事情(唯一的区别是一个是用 make 编写的,另一个是用 cmake 编写的)。

我尝试寻找“cmake vs make”,但从未找到任何代码比较。即使只是一个简单的案例,理解这些差异也会非常有帮助。

最佳答案

以下 Makefile 构建名为 prog 的可执行文件从来源 prog1.c, prog2.c, prog3.c and main.cprog链接到 libmystatlib.alibmydynlib.so它们都是从源代码构建的。此外,prog用途图书馆libstuff.astuff/lib及其标题 stuff/include 。这Makefile 默认构建一个发布目标,但也提供一个调试目标:

#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 可以识别哪种编译器适用于哪种源代码。还有,它为每种类型的目标调用正确的命令序列。因此,有没有像 $(CC) ... 这样的命令的明确规范, $(RANLIB) ...等等。

  • 所有常见的编译器/链接器标志处理头文件、库等的包含。被平台无关/构建系统无关的命令取代。

  • 通过设置变量 CMAKE_BUILD_TYPE 来包含调试标志。到“调试”,或者在调用程序时将其传递给 CMake:cmake -DCMAKE_BUILD_TYPE:STRING=Debug .

  • CMake 还提供独立于平台的“-fPIC”标志(通过POSITION_INDEPENDENT_CODE属性(property))和许多其他。尽管如此,更多模糊的设置可以在 CMake 中以及在 Makefile 中手动实现(通过使用 COMPILE_FLAGS和类似的属性)。当然,当第三方出现时,CMake 才真正开始大放异彩库(如 OpenGL)以可移植的方式包含在内。

  • 如果使用 Makefile,构建过程只有一个步骤,即输入 make在命令行中。对于 CMake,有两个步骤:首先,您需要设置构建环境(通过在构建目录中键入 cmake <source_dir> 或运行某些 GUI 客户端)。这将创建一个 Makefile 或等效文件,具体取决于您选择的构建系统(例如 Unix 上的 make 或 Windows 上的 VC++ 或 MinGW + Msys)。构建系统可以作为参数传递给CMake;但是,CMake 根据您的系统配置做出合理的默认选择。其次,您在选定的构建系统中执行实际构建。

源代码和构建说明可在 https://github.com/rhoelzel/make_cmake 获取。 .

关于makefile - Cmake 与 make 示例代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10882030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com