以示例解析CMakeLists.txt编写

示例:

程序目录结构:工程testcmake目录下,有一个main.cpp文件,add文件夹,sub文件夹.其中add文件夹包含add.cpp和add.h,sub文件夹包含sub.cpp和sub.h文件.

// --------main.cpp

#include <iostream>
#include <vector>
#include <thread>
#include "add/add.h"
#include "sub/sub.h"

using namespace std;
void fun(int i)
{
    cout << "thread " << i << endl;
}

int main()
{
   int a = 1, b = 2;
   cout << a << " + " << b << " = " << add(a, b) << endl;
   cout << a << " - " << b << " = " << sub(a, b) << endl;
   vector<int> v = {1,2,3,4,5};
   for (auto e: v)
   {
       thread t(fun, e);
       t.join();
   }
   cout << endl;

   return 0;
}


//---------add.cpp

#include "add.h"

int add(int a, int b)
{
    return a + b;
}

//---------add.h

#ifndef ADD
#define ADD

int add(int a, int b);

#endif // ADD


//---------sub.cpp

#include "sub.h"

int sub(int a, int b)
{
    return a - b;
}

//---------sub.h

#ifndef SUB
#define SUB

int sub(int a, int b);

#endif // SUB
#---CMakeLists.txt
# 工程名字
project(testcmake)

#要求使用的cmake最低版本
cmake_minimum_required(VERSION 2.8)

#将工程目录下的add文件夹的所有文件名保存到变量add_arcs,
#这里只有一个文件,如果有多个文件可以添加多个 空格隔开即可
#或者这么写:set(ADD_SRCS add/*.cpp)
set(ADD_SRCS add/add.cpp)

# CMAKE_CXX_FLAGS: set compiler for c++ language
# 对下边几个选项解释:
# -g : 要生成调试信息时,必不可少的选项.
# -std=c++0x : C++11之前被称为C++0x,因为原本计划在2010年发布,所以之前一些编译器使用C++11的编译参数是:-std=c++0x,后面使用:-std=c++11
# -O0: 表示不进行优化
# -Wall: 可以这么理解 Warn all,即是打开所有警告.
# -Wno-unused-variable: 顾名思义,对未使用到的变量不警告.
# -pthread: 在这里设置了C++编译器需要链接的线程库,后边如果有程序要用到就不用再去重新链接了.
# 线程库为libpthread.so,在这里设置的话,只能使用类似 -pthread 的形式.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -g -Wall -O0 -Wno-unused-variable -pthread")

#设置变量的值,注意不要直接等于赋值噢,需要用set.
#SUB_LIB="sub"
set(SUB_LIB "sub")

#生成的动态库名字为libsub.so
#SHARED ----动态库
#STATIC ----静态库
#MODULE ----这个用的少点.
add_library(${SUB_LIB} SHARED sub/sub.cpp)
link_directories(
        ${PROJECT_SOURCE_DIR}/build
        /usr/lib/
)

#该指令的作用主要是指定要链接的库文件的路径
# 查找所需要的mysql库是否存在,查找结果存储到MYSQL_LIB变量中,当然我这里代码是没有用到的,列在此处作为例子.
find_library(MYSQL_LIB libmysqlclient.so /usr/lib/)
IF (NOT MYSQL_LIB)
    MESSAGE(FATAL_ERROR "mysqlclient not found")
ENDIF(NOT MYSQL_LIB)

include_directories(${PROJECT_SOURCE_DIR}/sub)
#将当前目录下的所有源文件名字存储在SRC_LIST中.
aux_source_directory(. SRC_LIST)

# 生成可执行性文件.
add_executable(${PROJECT_NAME} ${SRC_LIST} ${ADD_SRCS} )

#需要链接的动态库,此处链接线程库,由于前边已经设置了,所以此处可以不用链接pthread.
#如果使用target_link_libraries的话,它一定要放在add_executable后边.
target_link_libraries(${PROJECT_NAME} sub)






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值