Skip to content

Commit 9354c3e

Browse files
committed
init repo
0 parents  commit 9354c3e

File tree

28 files changed

+246
-0
lines changed

28 files changed

+246
-0
lines changed

.gitignore

Whitespace-only changes.

3rdparty/.gitkeep

Whitespace-only changes.

CMakeLists.txt

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# 指定 cmake版本
2+
# 指定 project name
3+
# 指定生成文件的输出目录
4+
cmake_minimum_required(VERSION 2.8)
5+
project(project_name)
6+
7+
message("-- system arch: ${CMAKE_SYSTEM_PROCESSOR}")
8+
message("-- output path: ${PROJECT_OUTPUT_DIR} ")
9+
10+
# set output path
11+
set(PROJECT_OUTPUT_DIR ${PROJECT_BINARY_DIR}/${CMAKE_SYSTEM_PROCESSOR})
12+
SET(PROJECT_INCLUDE_DIR ${PROJECT_OUTPUT_DIR}/include)
13+
14+
# mkdir directory
15+
file(MAKE_DIRECTORY ${PROJECT_INCLUDE_DIR})
16+
FILE(MAKE_DIRECTORY ${PROJECT_OUTPUT_DIR}/bin)
17+
FILE(MAKE_DIRECTORY ${PROJECT_OUTPUT_DIR}/lib)
18+
19+
## set the target path
20+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIR}/bin)
21+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIR}/lib)
22+
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIR}/lib)
23+
24+
# 中间部分-指定工程依赖
25+
# 指定工程需要用到的一些系统包和库
26+
# 指定依赖的库文件
27+
28+
find_package(PkgConfig)
29+
pkg_check_modules(GSTREAMER QUIET gstreamer-1.0)
30+
pkg_check_modules(GST_APP REQUIRED gstreamer-app-1.0)
31+
32+
find_package(Qt4 REQUIRED)
33+
find_package(CUDA)
34+
find_package(OpenGL)
35+
find_package(OpenCV)
36+
37+
## set c++11 编译选项
38+
# -std=c++11 包含C++11特性
39+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
40+
41+
## set CUDA NVCC编译选项
42+
set(
43+
CUDA_NVCC_FLAGS
44+
${CUDA_NVCC_FLAGS};
45+
-O3
46+
-gencode arch=compute_53,code=sm_53
47+
-gencode arch=compute_62,code=sm_62 ##TX2
48+
-gencode arch=compute_30,code=sm_30
49+
)
50+
51+
# INCLUDE for c/C++ include
52+
include_directories(${PROJECT_INCLUDE_DIR})
53+
include_directories(
54+
/usr/include/gstreamer-1.0
55+
/usr/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/gstreamer-1.0/include
56+
/usr/include/glib-2.0
57+
/usr/include/libxml2 /usr/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/glib-2.0/include
58+
/usr/include/opencv2
59+
)
60+
61+
# 结尾部分-指定输出文件
62+
63+
#create executable-file
64+
add_executable(exe-filename needed-C_or_C++file)
65+
66+
#create shared-library
67+
add_library(lib-filename SHARED needed-files-list)
68+
69+
## CUDA 版本
70+
cuda_add_executable(exe-filename needed-cu_file)
71+
cuda_add_library(lib-filename SHARED needed-cu_files-list)
72+
73+
## 对于有多个文件可以先创建一个变量 file-list
74+
file(GLOB gstcam_source lib/gstreamer/*cpp lib/image/*cpp lib/cuda/*cpp lib/cuda/*cu lib/opengl/*cpp )
75+
file(GLOB gstcam_include lib/gstreamer/*h lib/image/*h lib/cuda/*h lib/opengl/*h)
76+
77+
## 循环打印一下看看
78+
foreach(sources ${gstcam_source})
79+
MESSAGE("-- the ${PROJECT_NAME} contion ${sources}")
80+
endforeach(sources ${})
81+
82+
83+
## creat gstcam shared library
84+
cuda_add_library(${PROJECT_NAME} SHARED ${gstcam_source})
85+
target_link_libraries(${PROJECT_NAME} Qt4::QtGui GL GLEW gstreamer-1.0 gstapp-1.0 ${OpenCV_LIBS})
86+
87+
# transfer all headers to the include directory
88+
foreach(include ${gstcam_include})
89+
message("-- Copying ${include}")
90+
configure_file(${include} ${PROJECT_INCLUDE_DIR} COPYONLY)
91+
endforeach()
92+
93+
## create exe-file
94+
add_executable(gst_app_test src/gst-camera.cpp)
95+
target_link_libraries(gst_app_test ${PROJECT_NAME})
96+

Jenkinsfile

Whitespace-only changes.

LICENSE

Whitespace-only changes.

build.sh

Whitespace-only changes.

build/.gitkeep

Whitespace-only changes.

deploy/bin/.gitkeep

Whitespace-only changes.

deploy/include/.gitkeep

Whitespace-only changes.

deploy/lib/.gitkeep

Whitespace-only changes.

doc/.gitkeep

Whitespace-only changes.

include/project_name/module_1/module_1.h

Whitespace-only changes.

include/project_name/project_name.h

Whitespace-only changes.

platforms/.gitkeep

Whitespace-only changes.

project_name/main.cc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

project_name/main.h

Whitespace-only changes.

project_name/module1/dir_1/.gitkeep

Whitespace-only changes.

project_name/module1/dir_2/.gitkeep

Whitespace-only changes.

project_name/module1/module1.cc

Whitespace-only changes.

project_name/module1/module1.h

Whitespace-only changes.

project_name/module2/module2.cc

Whitespace-only changes.

project_name/module2/module2.h

Whitespace-only changes.

readme.md

+149
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
# cpp工程目录结构(私人用)
2+
3+
文档名称:C++工程目录规范
4+
5+
| 序号 | 更改原因 | 版本 | 作者 | 更改日期 | 备注 |
6+
| ---- | -------- | ---- | ---- | -------- | ---- |
7+
| 1 | 创建文档 | v0.1 | Hatton | 2019.7.10 ||
8+
| | | | | | |
9+
| | | | | | |
10+
11+
# 前言
12+
13+
由于组内项目代码几乎没有规范的目录结构,几经迭代开发之后,整个项目代码看起来已经惨不忍睹。于是,笔者针对C++工程目录的规范进行了调研。不过,项目目录的规范本身就是一个仁者见仁智者见智的问题,就好比笔者和组长在针对头文件的存放问题上就存在了分歧。不过,这种规范的事情哪有对错,干脆组内项目就按照组长的意思来,自己做项目的话还是按照自己的想法舒服一点,于是乎这个 `repo` 就产生了。这个目录结构参考了大量的网络资料,经过笔者的理解总结而成,不过笔者也没有什么丰富的工程经验,只是按照现有的理解感觉这么分配比较合理。当然,有规范总比没有好,先按此规范执行,若发现不合适的地方再进行调整。
14+
15+
# 顶层目录结构
16+
17+
```shell
18+
project_name
19+
├── deploy
20+
├── build
21+
├── doc
22+
├── 3rdparty
23+
├── include
24+
│ └── project_name
25+
├── project_name
26+
├── tools
27+
├── scripts
28+
├── platforms
29+
├── test
30+
├── LICENSE
31+
├── CMakeLists.txt
32+
├── build.sh
33+
├── toolchain.cmake
34+
├── .gitignore
35+
├── readme.md
36+
└── sample
37+
```
38+
39+
- **deploy :** 用于存放部署、交付的文件,其包含子目录bin、lib、include分别存放本项目最总生成的可执行文件、库文件以及对外所提供的头文件。
40+
- **build :** 用于存放build时cmake产生的中间文件,其包含子目录release和debug。
41+
- **doc :** 用于存放项目的相关文档。
42+
- **3rdparty :** 用于存放第三方库,每个第三库以单独目录的形式组织在3rdparty目录下。其中每个第三方目录下又有 `include``lib` 分别存放第三方库的头文件和库文件。
43+
- **include/project_name :** 用于存放每个模块以及整个工程对外的头文件。具体格式如下文。
44+
- **project_name :** 存放源码文件,以及内部头文件。具体格式如下文。
45+
- **tools :** 包含一些支持项目构建的工具,如编译器等,一般情况下使用软链接。
46+
- **scripts :** 包含一些脚本文件,如使用Jenkins进行自动化构建时所需要的脚本文件,以及一些用于预处理的脚本文件。
47+
- **platforms :** 用于一些交叉编译时所需要的工具链等文件,按照平台进行划分来组织子目录。每个子目录下存放 `toolchain.cmake` 等用于指定平台的文件。
48+
- **test :** 分模块存放测试代码。
49+
- **LICENSE :** 版权信息说明。
50+
- **CMakeLists.txt :** cmake文件。
51+
- **build.sh :** build脚本文件。
52+
- **.gitignore :** 指明git忽略规则。
53+
- **readme.md :** 存放工程说明文件。
54+
- **sample :** 存放示例代码。
55+
56+
# 源文件目录结构说明
57+
58+
结构示例:
59+
60+
```shell
61+
# example modules tree
62+
project_name
63+
├── module_1
64+
│   ├── dir_1
65+
│ │   ├── something.cc
66+
│ │   └── something.h
67+
│   ├── dir_2
68+
│   ├── module_1.cc
69+
│   ├── CMakeLists.txt
70+
│   └── README.md
71+
├── module_2
72+
│   ├── dir_1
73+
│   ├── dir_2
74+
│   ├── module_2.cc
75+
│   ├── CMakeLists.txt
76+
│   └── README.md
77+
├── module_3
78+
├── main.cc
79+
└── CMakeLists.txt
80+
```
81+
82+
1. 总源码文件目录以 `project_name` 命名,即与项目同名,存放在项目根目录下。
83+
2. 源码文件分模块进行组织,分别以各个模块进行命名存放在 `project_name` 目录下,如示例中的 `module_1``module_2`
84+
3. 在每个子模块目录下,只包含源文件以及该模块内部所调用的头文件。
85+
4. 每个子模块的根目录下存放该模块的主要功能逻辑代码,如 `module_1.cc`。另外,可按照功能再划分子目录进行源码组织,但不可以出现模块嵌套的情况。
86+
5. 若要包含内部头文件时,包含路径要从 `project_name` 开始路径要完整,如`#include "project_name/module1/dir_1/somthing.h"`,以防止头文件名称冲突的情况,同时遵循了[Google C++编码规范](https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/)
87+
88+
# 头文件目录结构说明
89+
90+
```shell
91+
# example 3rdparty tree
92+
include
93+
└── project_name
94+
├── module_1
95+
│   ├── module_1_header_1.h
96+
│   └── module_1_header_2.h
97+
├── module_2
98+
│   └── module_2.h
99+
└── project_name.h
100+
```
101+
102+
1. (公共)头文件目录以 `include/project_name` 命名,即文件目录为两级,存放在项目根目录下。该目录只包含所有对外的头文件。
103+
2. 头文件同样分模块进行组织,分别以各个模块进行命名存放在 `include/project_name` 目录下,如示例中的 `module_1``module_1`
104+
3. `include/project_name` 目录下最多只包含一级子目录,即最多按照模块再划分一级,模块内的功能头文件不再以功能进行划分。
105+
4. 若要包含外部头文件时,包含路径同样要从 `project_name` 开始路径要完整,如`#include "project_name/module_2/module_2.h"`
106+
107+
# 其他
108+
109+
1. 针对头文件的包含,顶层 `CMakeLists.txt` 只指定 `${CMAKE_SOURCE_DIR}\include``${CMAKE_SOURCE_DIR}`,以保证所有的包含规则都是从工程根目录开始包含。
110+
2. 添加 `include` 目录使得公共头文件和对内部文件可以分离开,使多个模块之间合作开发时项目内部结构更加清晰。
111+
5. (暂时)在 `3rdparty` 下存放的工程中用到的第三方库和第三方源码。第三方库尽量不要直接把静态连接库直接放到git仓库中,应该另外提供链接以便下载,或者提供文档说明库的名称和版本自行安装下载,或者提供git仓库自行编译。第三方源码一般为开源的,只提供git链接。
112+
113+
# 参考
114+
115+
大型项目CMakeLIsts.txt的编写规范
116+
https://blog.csdn.net/dongfang1984/article/details/55105537
117+
118+
CmakeLists.txt书写规范
119+
https://blog.csdn.net/csdnhuaong/article/details/80895679
120+
121+
cmake简介与编写规范
122+
http://675816156.github.io/2016/06/26/cmake%E7%AE%80%E4%BB%8B%E4%B8%8E%E7%BC%96%E5%86%99%E8%A7%84%E8%8C%83/
123+
124+
C++工程目录架构推荐
125+
https://www.cnblogs.com/kuliuheng/p/5729559.html
126+
127+
A Simple C++ Project Structure
128+
https://hiltmon.com/blog/2013/07/03/a-simple-c-plus-plus-project-structure/
129+
130+
Directory Structure for a C++ Project
131+
https://mariuszbartosik.com/directory-structure-for-a-c-project/
132+
133+
C++ application development ( Part 1 — Project structure )
134+
https://medium.com/heuristics/c-application-development-part-1-project-structure-454b00f9eddc
135+
136+
AakashMallik/C++ project structure (与上个参考重)
137+
https://gist.github.com/AakashMallik/f7451b09a0807ed7203fb97cd125bff5#file-c-project-structure
138+
139+
Filesystem Hierarchy Standard
140+
http://www.pathname.com/fhs/pub/fhs-2.3.html
141+
142+
How to structure your project
143+
https://cliutils.gitlab.io/modern-cmake/chapters/basics/structure.html
144+
145+
kigster/cmake-project-template
146+
https://github.com/kigster/cmake-project-template
147+
148+
opencv/opencv
149+
https://github.com/opencv/opencv

sample/.gitkeep

Whitespace-only changes.

scripts/.gitkeep

Whitespace-only changes.

test/.gitkeep

Whitespace-only changes.

toolchain.cmake

Whitespace-only changes.

tools/.gitkeep

Whitespace-only changes.

0 commit comments

Comments
 (0)