如果此问题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配置/调整
如果我们需要以某种调试标志对其进行编译,则可以调用makelike,
make CXXFLAGS=NDEBUG
我认为,内部变量,Makefile-rules并CMake-functions有良好的开端为比较,好运与更多的挖掘。
cmake我也想要这个。但是我怀疑您会找到它,因为这些功能无法将它们很好地映射到另一个。如果您尝试使cmake行为像make,那么您将认真对待自己。最好只是从头开始。琐碎的事情会make涉及很多cmake,反之亦然。