在windows下,利用宇宙IDE vs可以很轻松的管理大型项目,实现各模块编译为一个链接库,多个应用引用链接库,在ubuntu下则只有利用cmakelist来实现,这里以简单的helloworld为例,记录本人的项目管理cmakelist,首先给出helloworld工程项目文件树:

helloworld

├── CMakeLists.txt

├── app

│   ├── CMakeLists.txt
│   ├── hello_world1_demo
│   │   ├── CMakeLists.txt

│   │   └── hello_world1_main.cpp


├── common
│   ├── CMakeLists.txt
│   ├── hello_world_common.cpp

│   └── hello_world_common.h


└── io
    ├── CMakeLists.txt
    ├── hello_world_io.cpp

    └── hello_world_io.h

其中,helloworld为整个工程的根目录,包含三个子文件夹分别是app,common,io,以及一个CMakeLists.txt;其中io文件夹包含的是整个工程用来输入输出的所有模块,common包含整个工程共用的数据结构,算法等等,二者将分别编译成库供app中demo应用使用,这里根目录CMakeLists.txt如下:

CMAKE_MINIMUM_REQUIRED(VERSION 3.1)

PROJECT(helloworld)

# Set up the top-level include directories
include_directories(${helloworld_SOURCE_DIR}  ${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})


# Include the subdirectories
ADD_SUBDIRECTORY(app)
ADD_SUBDIRECTORY(common)
ADD_SUBDIRECTORY(io)

其中include_directories和link_directories用来制定第三方库的头文件和lib文件,这里以pcl为例。

然后三个ADD_SUBDIRECTORY包含了三个子模块,接下来对每个子模块内进行说明。

一、io目录下CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.10)
project(io)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

#find_package(Qt5Core)
set(CMAKE_CXX_STANDARD 11)



AUX_SOURCE_DIRECTORY(. DIR_SRCS)
FILE(GLOB headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h" "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp")
ADD_LIBRARY(${PROJECT_NAME} ${DIR_SRCS} ${headers})

其中AUX_SOURCE_DIRECOTRY表示讲所有源文件路径给DIR_SRCS

FILE则是讲所有 .h以及.hpp给headers,最后ADD_LIBRARY将所有源文件以及头文件生成库io

二、common目录下CMakeLists.txt与io类似,这里不再展示。

三、app下为应用模块,这里由于可能包括多个应用文件夹,因此在app文件夹下也有一个CMakeLists.txt,由于下面只有一个应用,即hello_world1_demo,因此该txt只有一行:

ADD_SUBDIRECTORY(hello_world1_demo)

接下来的hello_world1_demo下的CMakeLists.txt为

cmake_minimum_required(VERSION 3.10)
project(hello_world1_demo)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

#find_package(Qt5Core)
set(CMAKE_CXX_STANDARD 11)

AUX_SOURCE_DIRECTORY(. DIR_SRCS)
FILE(GLOB headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h" "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp")
add_executable(${PROJECT_NAME} ${DIR_SRCS} ${headers})

target_link_libraries (${PROJECT_NAME} io common)
这里除后两行均和前面io模块一致,不再解释,而add_executable表示生成的是可执行文件,通过当前文件夹下的源文件以及头文件,target_link_libraries则是将io以及common模块链接给该执行文件。

接下来用QT-creator打开helloworld下的CMakelists.txt,可以看到完整目录:

ubuntu下cmakelist组织大型项目

完整代码请查看csdn:

https://download.csdn.net/download/rjasd1128hf/10491103


 
                    
            
                

相关文章: