#include <iostream>
#include <thread>
using namespace std;
void ThreadFunc(){
this_thread::sleep_for(chrono::milliseconds(100));
cout<<"this thread fun over"<<endl;
}
int main(){
thread t(ThreadFunc);
t.join();
return 0;
}
假设我们需要编译这样一段代码,如果在命名行完整的写完一条编译指令,大概是下面这个样子的,看起来很长,也很繁琐的样子。
g++ -o main -g main.cpp -l/usr/include -L/usr/lib -lpthread -std=c++11 -DHELLO
- -o:执行生成可执行文件的名称;
- -g:生成debug版本的可执行文件,不加默认为release版本;
- -l:指定头文件的搜索路径;
- -L:指定库文件的搜索路径;
- -lxxx:"xxx"指的是动态库的名字,这样写我们需要链接的动态库;
- -D:如-DHELLO,其中HELLO是宏名,表示编译时将这个也编译到程序中。
int main()
{
#ifdef HELLO
printf("HELLO defined !\n");
#else
printf("HELLO not define!\n");
#endif
return 0;
}
如果我们在编译的时候 g++ -DHELLO,可执行程序运行以后打印出"HELLO defined ".
不过,一般来讲系统的头文件和库是不需要我们指定的,这样写出来是为了更加的直观。
接下来,我将上面的那条看起来有点乱的编译指令改写成一个一目了然,通俗易懂的cmake语句。
#CMakeLists.txt
cmake_minimum_required(VERSION 3.5) #指定cmake的最小的版本
project(test) #为当前的工程起名,不是可执行文件名
set(CMAKE_BUILD_TYPE "Debug")#设置debug模式,如果没有这一行将不能调试设断点
#配置编译选项 如 -g等,具体可以搜索都支持哪些选项
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g -O -Wall -std=c++11)
#可以给一个路径起一个变量名,PROJECT_SOURCE_DIR:工程的根目录
set(A_MODULE_PATH ${PROJECT_SOURCE_DIR}/Path1/Path2)
#配置头文件搜索路径,比如将包含A_MODULE_PATH路径下的头文件
include_directories(${A_MODULE_PATH}/include1/
${A_MODULE_PATH}/include2/
)
#配置库的搜索路径,再比如引用链接A_MODULE_PATH路径下的库文件
link_directories(${A_MODULE_PATH}/lib1/
${A_MODULE_PATH}/lib2/
)
#设置需要编译的源文件列表
set(SRC_LIST a.cpp b.cpp e.cpp main.cpp) #等同于将a.cpp b.cpp e.cpp main.cpp保存到SRC_LIST变量中
#生成可执行程序,等同于将指定的源文件生成指定名称的可执行程序,可执行文件名为main
add_executable(main ${SRC_LIST})#适用于源文件比较少的情况,否则需要一一添加
#搜索指定路径下的所有源文件,并且保存在变量中
#适用于源文件特别多的的情况,一一将所有源文件列举不现实,自动搜索指定路径下的所有源文件
aux_source_directory(. SRCS_LIST)
#可执行文件链接库
target_link_libraries(main pthread lib1 lib2 lib3)
#不需要添加-l,但是等同于命令行的-l,cmake会自动添加