如果此问题Makefile
与CMakeList.txt
文件的示例输出有关,请检查cmake后端源并生成一个这样的源Makefile
。如果不是的话,那么我会在@Roberto的回复中添加隐藏详细信息,以使其变得简单。
CMake功能
虽然Make
是用于规则和配方的灵活工具,但它CMake
是抽象层,还添加了配置功能。
我的平原CMakeLists.txt
将如下所示,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
注意,CMake
隐藏how
构建即可完成。我们只指定what
输入和输出。
CMakeLists.txt
由定义的函数调用的包含列表cmake
。
(CMake功能)与制作规则
在Makefile
将rules and recipes
被用来代替functions
。除了function
-like功能,还rules and recipes
提供链接。我的简约风格Makefile
如下所示,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
虽然executable.mk
将如下所示,
SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:.cpp=.o)
DEPS=$(SOURCES:.cpp=.d)
%.bin:$(OBJECTS)
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) $(DEPS) $(TARGETS)
-include $(DEPS)
从头开始,我将从Makefile
以下内容开始,
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
我从这里得到了这个片段并对其进行了修改。请注意,一些隐式规则已添加到此文件中,这些规则可以在makefile文档中找到。一些隐式变量在这里也很重要。
注意,这Makefile
提供了recipe
显示how
可以完成构建的详细信息。可以编写executable.mk
以将详细信息保留在一个文件中。这样,可以减少makefile,如我之前所示。
在内部变量CMake
和Make
现在变得有点高级了,CMake
我们可以像下面这样设置一个编译器标志,
set(CMAKE_C_FLAGS "-Wall")
请CMake
在CMakeCache.txt
文件中找到有关默认变量的更多信息。CMake
上面的代码将等同于Make
下面的代码,
CFLAGS = -Wall
请注意,CFLAGS
中的内部变量Make
同样CMAKE_C_FLAGS
是中的内部变量CMake
。
在CMake中添加包含和库路径
我们可以cmake
使用函数来做到这一点。
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
与在Make中添加包含和库路径
我们可以通过添加如下行来添加包含和库,
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
请注意,以上这些行可以从自动生成工具或pkg-config生成。(尽管Makefile不依赖于自动配置工具)
CMake配置/周
通常,可以通过使用函数来生成一些config.h
文件,就像auto-config
工具一样configure_file
。编写自定义函数可以做更多的技巧。最后我们可以选择如下配置
cmake --build . --config "Release"
使用该option
功能可以添加一些可配置的选项。
Makefile配置/调整
如果我们需要以某种调试标志对其进行编译,则可以调用make
like,
make CXXFLAGS=NDEBUG
我认为,内部变量,Makefile-rules
并CMake-functions
有良好的开端为比较,好运与更多的挖掘。
cmake
我也想要这个。但是我怀疑您会找到它,因为这些功能无法将它们很好地映射到另一个。如果您尝试使cmake
行为像make
,那么您将认真对待自己。最好只是从头开始。琐碎的事情会make
涉及很多cmake
,反之亦然。