1、首先创建一个目录下的makefile
//main.cpp
#include<iostream>
using namespace std;
int main()
{
cout<<"Hello word!"<<endl;
return 0;
}
在main文件所在的目录创建CMakeLists.txt
//CMakeLists.txt
PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})
PROJECT(main) 代表项目的名称是main
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 代表CMake的最低版本是2.8
AUX_SOURCE_DIRECTORY(. DIR_SRCS) 将当前目录的源文件名赋值给DIR_SRCS
ADD_EXECUTABLE(main ${DIR_SRCS}) 将 变量${DIR_SRCS}中的文件编译成执行文件mian
执行 cmake CMakeLists.txt 会生成makefile文件。 之后执行make即可
2、首先多个目录下的makefile
上图为层级不同目录的层级关系
src目录下生成lib库文件,放在src目录下, main需要调用静态库
// main.cpp
#include <iostream>
#include "ModifyConfig.h"
int main()
{
TestCmake();
return 0;
}
// ModifyConfig.cpp
#include "ModifyConfig.h"
void TestCmake()
{
std::cout << "hello cmake " << std::endl
}
// ModifyConfig.h
#ifndef __MODIFY_CONFIG_H__
#define __MODIFY_CONFIG_H__
#include <iostream>
void TestCmake();
#endif
以上是简单源码
然后我们在main.cpp所在目录创建CMakeLists.txt
// CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(cmakeTest)
aux_source_directory(. DIR_SRCS)
include_directories(./include)
add_subdirectory(src)
add_executable(main ${DIR_SRCS})
target_link_libraries(main source_lib)
include_directories(./include) 设置包含目录, 这里代表包含 ./include的文件夹
add_subdirectory(src) 增加模块目录, src文件夹就是一个新的模块, 文件夹内也要有对应的CMakeLists.txt文件
target_link_libraries(main source_lib) 指明可执行文件需要source_lib的链接库
再看src模块下的CMakeLists.txt
//CMakeLists.txt
aux_source_directory(. DIR_SOURCE_SRCS)
add_library(source_lib SHARED ${DIR_SOURCE_SRCS})
add_library(source_lib ${DIR_SOURCE_SRCS}) 将变量${DIR_SOURCE_SRCS}中的文件编译成一个静态库 所在目录为当前文件夹下
可以看到source_lib对应的就是 上一次CMakeLists.txt中需要的链接库
准备工作完毕 在main.cpp所在目录执行 cmake CMakeLists.txt 会生成对应的makefile文件
生成前的目录
生成后的目录
可以看到在根目录和src目录下都生成了Makefile文件 , 其他的文件不用管。 我暂时还不知道什么用
之后在根目录下执行make即可
如果想生成动态库 则修改
add_library(source_lib ${DIR_SOURCE_SRCS})为
add_library(source_lib SHARED ${DIR_SOURCE_SRCS})
然后重新cmake即可
3、设置生成的库和执行文件的位置
LIBRARY_OUTPUT_PATH 设置库生成的默认路径
CMAKE_RUNTIME_OUTPUT_DIRECTORY 设置可执行文件生成的默认路径
// CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(cmakeTest)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
aux_source_directory(. DIR_SRCS)
include_directories(./include)
add_subdirectory(src)
add_executable(main ${DIR_SRCS})
target_link_libraries(main source_lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) 这一句就设置了可执行文件的生成路径为本文件夹下的bin目录