CMakeLists.txt生成makefile

CMakeLists.txt生成makefile,第1张

CMakeLists.txt生成makefile

1 单个源文件编译

main.c 

#include
int main()
{
    printf("Hello World Test!n");
    return 0;
}


CMakeLists.txt:

project(hello)
set(APP_SRC main.c)
add_executable(${PROJECT_NAME} main.c)
message(${PROJECT_SOURCE_DIR})


解释代码:

第一行project非强制性,会引入两个变量:

HELLO_BINARY_DIR, HELLO_SOURCE_DIR

同时也会定义两个等价的变量:

PROJECT_BINARY_DIR, PROJECT_SOURCE_DIR

外部编译要时刻区分这两个变量对应的目录

可以通过message进行输出

message(${PROJECT_SOURCE_DIR})

set 命令用来设置变量

add_exectuable 告诉工程生成一个可执行文件。

add_library 则告诉生成一个库文件。

CMakeList.txt 文件中,命令名字是不区分大小写的,而参数和变量是大小写相关的。

 

aux_source_directory(. SRC_LIST) # 搜索当前目录下的所有.cpp文件

add_library(demo ${SRC_LIST})


file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_library(demo ${SRC_LIST})
# 或者
file(GLOB SRC_LIST "*.cpp")
file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
# 或者
file(GLOB_RECURSE SRC_LIST "*.cpp") #递归搜索
FILE(GLOB SRC_PROTOCOL RELATIVE "protocol" "*.cpp") # 相对protocol目录下搜索
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
# 或者
aux_source_directory(. SRC_LIST)
aux_source_directory(protocol SRC_PROTOCOL_LIST)
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})

设置包含目录

include_directories(

${CMAKE_CURRENT_SOURCE_DIR}

${CMAKE_CURRENT_BINARY_DIR}

${CMAKE_CURRENT_SOURCE_DIR}/include

)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}")

#设置链接库搜索目录

link_directories(

${CMAKE_CURRENT_SOURCE_DIR}/libs

)

或set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_SOURCE_DIR}/libs")

#设置target需要链接的库

target_link_libraries(demo libface.a) # 链接libface.a

target_link_libraries(demo libface.so) # 链接libface.so

#链接多个库

target_link_libraries(demo

${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a

boost_system.a

boost_thread

pthread)

1. 预定义变量
PROJECT_SOURCE_DIR:工程的根目录
PROJECT_BINARY_DIR:运行 cmake 命令的目录,通常是 ${PROJECT_SOURCE_DIR}/build
PROJECT_NAME:返回通过 project 命令定义的项目名称
CMAKE_CURRENT_SOURCE_DIR:当前处理的 CMakeLists.txt 所在的路径
CMAKE_CURRENT_BINARY_DIR:target 编译目录
CMAKE_CURRENT_LIST_DIR:CMakeLists.txt 的完整路径
CMAKE_CURRENT_LIST_LINE:当前所在的行
CMAKE_MODULE_PATH:定义自己的 cmake 模块所在的路径,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块
EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置
 

2. 系统信息
­CMAKE_MAJOR_VERSION:cmake 主版本号,比如 3.4.1 中的 3
­CMAKE_MINOR_VERSION:cmake 次版本号,比如 3.4.1 中的 4
­CMAKE_PATCH_VERSION:cmake 补丁等级,比如 3.4.1 中的 1
­CMAKE_SYSTEM:系统名称,比如 Linux-­2.6.22
­CMAKE_SYSTEM_NAME:不包含版本的系统名,比如 Linux
­CMAKE_SYSTEM_VERSION:系统版本,比如 2.6.22
­CMAKE_SYSTEM_PROCESSOR:处理器名称,比如 i686
­UNIX:在所有的类 UNIX 平台下该值为 TRUE,包括 OS X 和 cygwin
­WIN32:在所有的 win32 平台下该值为 TRUE,包括 cygwin

3. 主要开关选项
BUILD_SHARED_LIBS:这个开关用来控制默认的库编译方式,如果不进行设置,使用 add_library 又没有指定库类型的情况下,默认编译生成的库都是静态库。如果 set(BUILD_SHARED_LIBS ON) 后,默认生成的为动态库
CMAKE_C_FLAGS:设置 C 编译选项,也可以通过指令 add_definitions() 添加
CMAKE_CXX_FLAGS:设置 C++ 编译选项,也可以通过指令 add_definitions() 添加

add_definitions(-DENABLE_DEBUG -DABC) # 参数之间用空格分隔
 

将main.c和CMakeList.txt放在同一目录,

mkdir build

cd build

cmake ../

//此时会生成makefile文件
make

//此时生成相应的可执行程序。

2多个源文件编译


hello.h

#ifndef BUJIHELLO
#define BUJIHELLO
void hello(const char* name);
#endif


hello.c

#include
#include "hello.h"
 
void hello(const char* name)
{
    printf("Hello my name is %sn",name);
}


main.c

#include
#include "hello.h"
 
int main()
{
    printf("Hello World Test!n");
    hello("buji");
    return 0;
}


CMakeLists.txt

project(hello_buji)
set(APP_SRC main.c hello.c)
add_executable(${PROJECT_NAME} ${SRC_LIST})
 
#print message
message(${PROJECT_SOURCE_DIR})

执行cmake和make,就可以生成需要的可执行文件

3、hello.c生成库


如果将hello生成成一个库来调用,只需要在第2节基础上修改CMakeLists.txt

project(hello)
set(LIB_SRC hello.c)
set(APP_SRC main.c)

# 搜索当前目录下的所有.cpp文件

aux_source_directory(. SRC_LIST)

#默认生成静态库
add_library(hello ${LIB_SRC})

#指定包含哪些源文件

#add_library(hello hello.cpp test.cpp)

# 生成可执行文件
add_executable(${PROJECT_NAME} ${APP_SRC})   

# 生成静态库

#add_library(hello STATIC hello.cpp)

# 生成动态库或共享库

#add_library(hello SHARED hello.cpp)

target_link_libraries(${PROJECT_NAME} hello)
 
#print message
message(${PROJECT_NAME})
相比之下,我们只是添加了一个新的目标hello库,并将其链接到我们的demo程序

执行cmake和make

4、工程分类文件夹编译


大型项目有多个目录,此处我们创建3个目录 app,build,libso和 CMakeLists.txt文件。main.c程序放在app目录,hello.c hello.h放在libso目录,app和libso目录各自都有CMakeLists.txt文件。

app/CMakeLists.txt

project(hello_buji)
include_directories(${PROJECT_SOURCE_DIR}/../libso)
 
set(APP_SRC main.c)
add_executable(${PROJECT_NAME} main.c)
target_link_libraries(${PROJECT_NAME} helloso)
 
message(${PROJECT_SOURCE_DIR})


libso/CMakeLists.txt

其中SHARED 表示是生成的动态库,如果把SHARED去掉的话就是生成静态库

project(helloso)
 
set(LIB_SRC hello.c)
add_library(${PROJECT_NAME} SHARED ${LIB_SRC})

/CMakeLists.txt

#指定cmake最低版本

cmake_minimum_required (VERSION 3.2)
project(buji_cmake)
 
add_subdirectory(./app)
add_subdirectory(./libso)
其表示我们要到./app和./libso文件夹下面去寻找Cmake文件然后进行编译

cd build

cmake ../
make


5 Cmake的install简单使用


cmake中的install将编译好的可执行文件或库文件安装到系统对应的位置,/usr/bin,/usr/lib


app/CMakeLists.txt:在之前的基础上加了最后install一行

project(hello_buji)
include_directories(${PROJECT_SOURCE_DIR}/../libso)
 
set(APP_SRC main.c)
add_executable(${PROJECT_NAME} main.c)
target_link_libraries(${PROJECT_NAME} helloso)
 
message(${PROJECT_SOURCE_DIR})
 
install(TARGETS ${PROJECT_NAME} DESTINATION bin)


libso/CMakeLists.txt:在之前的基础上加了最后install一行

project(helloso)
 
set(LIB_SRC hello.c)
add_library(${PROJECT_NAME} SHARED ${LIB_SRC})
 
install(TARGETS ${PROJECT_NAME} DESTINATION ../lib)


install(TARGETS ${PROJECT_NAME} DESTINATION bin)意思是安装TARGERS hello_buji这个可执行文件到${CMAKE_INSTALL_PREFIX}/bin目录下面,

可执行文件安装的路径是:

/usr/local/bin/

so库文件的安装路径是:

/usr/local/../lib/

#cmake ../
#make
#make install

此时可以在Linux任何目录执行./hello_buji

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5702333.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存