cmake笔记1

如何打开linux下的图形化工作界面

我曾经天真的以为安装好了cmake脚本之后就可以打开图形化的工作界面,但是实际上对于友好的图形化界面是需要额外安装的,对于像windows这样的系统当然可以直接安装好界面,但是linux嘛,默认都是会用脚本解决一切问题的人,所以图形化的界面显然是多余的。

为什么需要安装图形化的cmake工作界面

听老师说过,学习cmake的精髓就是通过GUI找到自己的脚本配置。所以就是你还要sudo apt-get install cmake-gui

CMake项目的配置过程

命令的初识

在这里插入图片描述

头文件复杂引入方式(路径方法)

在这里插入图片描述

头文件简单引入方式(链接到头文件目录)

改进方法,PUBLIC就是让我们的头文件是可见的
在这里插入图片描述

将远程glfw作为子模块拉取下来

由于glfw很常见,所以就采用它作为我们的实验对象,子模块网址
在这里插入图片描述

将子模块全部提交到仓库

在这里插入图片描述

主目录下生产.gitmodules文件

在这里插入图片描述

编译子项目出错

在这里插入图片描述
在这里插入图片描述

根据提示查找对应的包即可

配置好相关的依赖包之后进行执行成功

适合所有图形处理库的环境

使用conda env create -n xxx_env -f xx.yml激活环境就可以运行编译上面的代码了

name: Colmap
channels:
  - intel
  - saedrna
  - conda-forge
  - zeus1942
  - defaults
dependencies:
  - _libgcc_mutex=0.1=conda_forge
  - _openmp_mutex=4.5=1_llvm
  - assimp=5.0.1=hac5445f_2
  - binutils_impl_linux-64=2.34=h2122c62_9
  - binutils_linux-64=2.34=h47ac705_27
  - blas=2.17=openblas
  - boost-cpp=1.72.0=h7b93d67_2
  - bzip2=1.0.8=h516909a_3
  - c-ares=1.16.1=h516909a_3
  - ca-certificates=2020.12.5=ha878542_0
  - cairo=1.16.0=h3fc0475_1005
  - capstone=4.0.2=py38h1e0a361_0
  - catch2=2.11.3=hc9558a2_0
  - cereal=1.3.0=0
  - ceres-solver=1.14.0=h0948850_10
  - certifi=2020.12.5=py38h578d9bd_1
  - cfitsio=3.470=hce51eda_6
  - cgal-cpp=5.0.3=h747953b_0
  - cmake=3.18.2=h5c55442_0
  - collada-dom=2.5.0=h4ace962_2
  - curl=7.71.1=he644dc0_5
  - dbus=1.13.6=he372182_0
  - eigen=3.3.7=hc9558a2_1001
  - embree3=3.11.0=hc9558a2_0
  - entwine=2.1.0=hb7262df_5
  - expat=2.2.9=he1b5a44_2
  - ffmpeg=4.3.1=h167e202_0
  - flann=1.9.1=h44f99b7_1008
  - fontconfig=2.13.1=h1056068_1002
  - freeimage=3.18.0=h6858f65_4
  - freetype=2.10.2=he06d7ca_0
  - freexl=1.0.5=h516909a_1002
  - gcc_impl_linux-64=9.3.0=ha2fd2e4_16
  - gcc_linux-64=9.3.0=h44160b2_27
  - gdal=3.1.2=py38hb61cb63_1
  - geogram=1.7.5=h5171369_1001
  - geographiclib=1.50=he1b5a44_1000
  - geos=3.8.1=he1b5a44_0
  - geotiff=1.6.0=ha04d9d0_1
  - gettext=0.19.8.1=hc5be6a0_1002
  - gflags=2.2.2=he1b5a44_1004
  - giflib=5.2.1=h516909a_2
  - glew=2.1.0=he1b5a44_0
  - glfw=3.3.2=h516909a_1
  - glib=2.65.0=h6f030ca_0
  - glm=0.9.9.4=hc9558a2_0
  - glog=0.4.0=h49b9bf7_3
  - gmp=6.2.0=he1b5a44_2
  - gnutls=3.6.13=h79a8f9a_0
  - graphite2=1.3.13=he1b5a44_1001
  - gst-plugins-base=1.14.5=h0935bb2_2
  - gstreamer=1.14.5=h36ae1b5_2
  - gxx_impl_linux-64=9.3.0=hde52e87_16
  - gxx_linux-64=9.3.0=ha9dd585_27
  - harfbuzz=2.7.2=hee91db6_0
  - hdf4=4.2.13=hf30be14_1003
  - hdf5=1.10.6=nompi_h3c11f04_101
  - icu=67.1=he1b5a44_0
  - ilmbase=2.5.2=h8b12597_0
  - ipp-include=2020.2=intel_254
  - ipp-static=2020.2=intel_254
  - jasper=1.900.1=h07fcdf6_1006
  - jpeg=9d=h516909a_0
  - json-c=0.13.1=hbfbb72e_1002
  - jsoncpp=1.8.4=hc9558a2_1002
  - jxrlib=1.1=h7f98852_2
  - kealib=1.4.13=h33137a7_1
  - kernel-headers_linux-64=2.6.32=h77966d4_13
  - krb5=1.17.1=hfafb76e_3
  - lame=3.100=h14c3975_1001
  - laszip=3.4.3=he1b5a44_1
  - laz-perf=1.4.4=he1b5a44_0
  - lcms2=2.11=hcbb858e_1
  - ld_impl_linux-64=2.34=hc38a660_9
  - libblas=3.8.0=17_openblas
  - libcblas=3.8.0=17_openblas
  - libclang=10.0.1=default_hde54327_1
  - libcurl=7.71.1=hcdd3856_5
  - libdap4=3.20.6=h1d1bd15_1
  - libdrm-cos6-x86_64=2.4.65=h9d98e8f_1104
  - libedit=3.1.20191231=he28a2e2_2
  - libev=4.33=h516909a_1
  - libevent=2.1.10=hcdb4288_2
  - libffi=3.2.1=he1b5a44_1007
  - libgcc-devel_linux-64=9.3.0=hfd08b2a_16
  - libgcc-ng=9.3.0=h24d8f2e_16
  - libgdal=3.1.2=hb2a6f5f_1
  - libgfortran-ng=7.5.0=hdf63c60_16
  - libglu=9.0.0=he1b5a44_1001
  - libgomp=9.3.0=h24d8f2e_16
  - libiconv=1.16=h516909a_0
  - libjpeg-turbo=2.0.3=h516909a_1
  - libkml=1.3.0=hb574062_1011
  - liblapack=3.8.0=17_openblas
  - liblapacke=3.8.0=17_openblas
  - libllvm10=10.0.1=he513fc3_3
  - libnetcdf=4.7.4=nompi_h84807e1_105
  - libnghttp2=1.41.0=h8cfc5f6_2
  - libopenblas=0.3.10=pthreads_hb3c22a3_4
  - libopencv=4.4.0=py38_2
  - libpng=1.6.37=hed695b0_2
  - libpq=12.3=h5513abc_0
  - libraw=0.20.2=h46eb526_0
  - libselinux-cos6-x86_64=2.0.94=h9d98e8f_1104
  - libsepol-cos6-x86_64=2.0.41=h9d98e8f_1104
  - libspatialite=4.3.0a=h57f1b35_1039
  - libssh2=1.9.0=hab1572f_5
  - libstdcxx-devel_linux-64=9.3.0=h4084dd6_16
  - libstdcxx-ng=9.3.0=hdf63c60_16
  - libtiff=4.1.0=hc7e4089_6
  - libuuid=2.32.1=h14c3975_1000
  - libuv=1.39.0=h516909a_0
  - libwebp-base=1.1.0=h516909a_3
  - libx11-common-cos6-x86_64=1.6.4=h9d98e8f_1104
  - libx11-cos6-x86_64=1.6.4=h9d98e8f_1104
  - libxau-cos6-x86_64=1.0.6=h9d98e8f_1104
  - libxcb=1.13=h14c3975_1002
  - libxcb-cos6-x86_64=1.12=h9d98e8f_1104
  - libxdamage-cos6-x86_64=1.1.3=h9d98e8f_1104
  - libxext-cos6-x86_64=1.3.3=h9d98e8f_1104
  - libxfixes-cos6-x86_64=5.0.3=h9d98e8f_1104
  - libxkbcommon=0.10.0=he1b5a44_0
  - libxml2=2.9.10=h68273f3_2
  - libxxf86vm-cos6-x86_64=1.1.3=h9d98e8f_1104
  - llvm-openmp=10.0.1=hc9558a2_0
  - lz4-c=1.9.2=he1b5a44_3
  - mesa-dri-drivers-cos6-x86_64=11.0.7=h9d98e8f_1104
  - mesa-dri1-drivers-cos6-x86_64=7.11=h9d98e8f_1104
  - mesa-libgl-cos6-x86_64=11.0.7=h9d98e8f_1104
  - mesa-libgl-devel-cos6-x86_64=11.0.7=h9d98e8f_1104
  - metis=5.1.0=he1b5a44_1006
  - mpfr=4.0.2=he80fd80_1
  - mysql-common=8.0.21=1
  - mysql-libs=8.0.21=hf3661c5_1
  - ncurses=6.2=he1b5a44_1
  - nettle=3.4.1=h1bed415_1002
  - ninja=1.10.1=hc9558a2_1
  - nitro=2.7.dev6=he1b5a44_3
  - nspr=4.28=he1b5a44_0
  - nss=3.56=he751ad9_0
  - numpy=1.19.1=py38hbc27379_2
  - ocl-icd=2.2.12=h516909a_1005
  - opencv=4.4.0=py38_2
  - openexr=2.5.2=he513fc3_0
  - openh264=2.1.1=h8b12597_0
  - openjpeg=2.3.1=h981e76c_3
  - openscenegraph=3.6.5=h9b5ab6a_9
  - openssl=1.1.1i=h7f98852_0
  - pcl=1.9.1=h2dfa329_1005
  - pcre=8.44=he1b5a44_0
  - pdal=2.1.0=h9463286_7
  - pip=20.2.2=py_0
  - pixman=0.38.0=h516909a_1003
  - poppler=0.89.0=h4190859_1
  - poppler-data=0.4.9=1
  - postgresql=12.3=h8573dbc_0
  - proj=7.1.0=h966b41f_1
  - pthread-stubs=0.4=h14c3975_1001
  - py-opencv=4.4.0=py38h23f93f0_2
  - python=3.8.5=h1103e12_7_cpython
  - python_abi=3.8=1_cp38
  - qhull=2019.1=hc9558a2_0
  - qt=5.12.9=h1f2b2cb_0
  - readline=8.0=he28a2e2_2
  - rhash=1.3.6=h14c3975_1001
  - setuptools=49.6.0=py38h32f6830_0
  - sqlite=3.33.0=h4cf870e_0
  - suitesparse=5.7.2=h717dc36_0
  - sysroot_linux-64=2.12=h77966d4_13
  - tbb=2020.2=hc9558a2_0
  - tbb-devel=2020.2=hc9558a2_0
  - tiledb=2.0.8=h3effe38_0
  - tk=8.6.10=hed695b0_0
  - tzcode=2020a=h516909a_0
  - wheel=0.35.1=pyh9f0ad1d_0
  - x264=1!152.20180806=h14c3975_0
  - xerces-c=3.2.3=hfe33f54_1
  - xorg-fixesproto=5.0=h14c3975_1002
  - xorg-kbproto=1.0.7=h14c3975_1002
  - xorg-libice=1.0.10=h516909a_0
  - xorg-libsm=1.2.3=h84519dc_1000
  - xorg-libx11=1.6.12=h516909a_0
  - xorg-libxau=1.0.9=h14c3975_0
  - xorg-libxcursor=1.2.0=h516909a_0
  - xorg-libxdmcp=1.1.3=h516909a_0
  - xorg-libxext=1.3.4=h516909a_0
  - xorg-libxfixes=5.0.3=h516909a_1004
  - xorg-libxinerama=1.1.4=hf484d3e_1000
  - xorg-libxrandr=1.5.2=h516909a_1
  - xorg-libxrender=0.9.10=h516909a_1002
  - xorg-randrproto=1.5.0=h516909a_1001
  - xorg-renderproto=0.11.1=h14c3975_1002
  - xorg-xextproto=7.3.0=h14c3975_1002
  - xorg-xproto=7.0.31=h14c3975_1007
  - xz=5.2.5=h516909a_1
  - zlib=1.2.11=h516909a_1009
  - zstd=1.4.5=h6597ccf_2
一般的CMake工程的编译原则就是下面的状况
configure.sh用于编译Makefile文件
rm build -rf
mkdir build
# cmake -S . -B ./build
# -D就是代表需要将哪一个选项进行操作,下面就是不编译GLFW文档
cmake -DGLFW_BUILD_DOCS=OFF -S . -B ./build
build.sh用于编译.o可执行文件和.a文件
cd build
# 下面就是利用编译好的Makefile进行编译成.o和.a以及.so静态库
make -j4
run.sh用于运行项目生产的.o文件
# 上面明明已经编译好了应该是进入了build文件但是实际上执行下来并没有进入build目录
cd build
./lincong

在这里插入图片描述
在这里插入图片描述

外层CMakeLists.txt
cmake_minimum_required(VERSION 3.10.4)

project(lincong)

# 下面的语句生成.o文件,linux平台下的可执行文件
add_executable(${PROJECT_NAME} src/main.cpp)

#在链接库目录之前先进行子集目录的编译
add_subdirectory(Adder)

#第二,为了我们引入头文件的便捷性,我们应该将头文件路径指出
target_include_directories(${PROJECT_NAME} PUBLIC Adder)


# 将自己编译的各个静态库部分链接到项目上
#addlib的名字为编译子目录的时候所取的名字
target_link_libraries(${PROJECT_NAME} addlib)

# 接下来是引入外部的GLFW部分

# 第一步,告诉CMake去哪里编译库
add_subdirectory(external/glfw)

# 第二步,链接头文件目录,这个目录是源文件所在位置文件所在位置而不是编译
target_include_directories(${PROJECT_NAME} 
    PUBLIC external/glfw/include)

# 第三步,链接静态库目录的前缀文件
target_link_directories(${PROJECT_NAME} 
    PRIVATE external/glfw/src)

# 第四步,链接静态库
target_link_libraries(${PROJECT_NAME} glfw)

# 经过第三步之后第四步才会正常执行否则就会报错
内层src目录的CMakeLists.txt
#其实当你自己根据惯性思维去做这个东西的时候
#你会发现aux那些函数根本就不支持这个路径的用法
#为了提高效率问题,就需要CMakeLists.txt文件搭建起各个部分之间的桥梁

#实际上这个静态库就是.a文件结尾的库

#将加法作为一个静态库
add_library(addlib add.cpp add.h)
目录结构

在这里插入图片描述

.gitignore
# .gitignore for c++

# Prerequisites
*.d

# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Compiled Dynamic libraries
*.so
*.dylib
*.dll

# Fortran module files
*.mod
*.smod

# Compiled Static libraries
*.lai
*.la
*.a
*.lib

# Executables
*.exe
*.out
*.app

# .gitignore for cmake

CMakeLists.txt.user
CMakeCache.txt
CMakeFiles
CMakeScripts
Testing
Makefile
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps

# .gitignore for build
build/

[Bb][Uu][Ii][Ll][Dd]/

版权声明:本文为qq_45605535原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。