简单工程编写
单一生成文件
以下就是一个最简单的工程编写的内容 代码内容如下:
#include <iostream>
using namespace std;
int main()
{
cout << "test cmake" << endl;
}
通常情况下:
g++ -o B main.cc
只需执行上述一行即可,但是因为大型工程再这样手动编译,显然不是一个好选择。 由于代码比较简单不涉及三方库或者系统库,也是单一文件夹,不涉及嵌套编译,此时编写CMakeLists.txt也比较容易。
cmake_minimum_required(VERSION 3.12)
project(A)
add_executable(B
main.cc
)
将main.cc文件和CMakeLists.txt文件放在同一文件夹下,然后创建一个新的文件夹build,形成如下的结构: . ├── build ├── CMakeLists.txt └── main.cc 此时,打开终端,执行如下步骤,即可完成编译运行
cd build
cmake ..
make
./B
多个生成文件
与Qt不同,CMake可以同时编译多个生成文件,多文件生成的工程文件CMakeLists.txt也很好编写。 工程文件结构如下: . ├── build ├── CMakeLists.txt ├── main1.cc └── main.cc 多个main文件时的CMakeLists.txt的编写如下:
cmake_minimum_required(VERSION 3.12)
project(A)
add_executable(B
main.cc
)
add_executable(C
main1.cc
)
然后进行编译运行即可,步骤同上。
编译选项
程序不可能依赖标准库,偶尔系统的一些库也是需要编译选项的。 例如:
g++ -o B main.cc
g++ -o B main.cc -g -Wall
其中-lz,-pthread就是编译选项,-g是支持gdb调试,-Wall选项意思是编译后显示所有警告。 如何添加编译选项呢?
cmake_minimum_required(VERSION 3.12)
project(npy2png)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -g")
add_executable(NpyToPng
main.cc
)
通过上述代码,可以看到@1和@2就是添加编译选项的方法,一般情况下只写一行就行,但是大型工程C和C++混写已经很常见了,省事儿起见,两行都写就行。此时进行编译生成就能看到warning信息,并且支持gdb调试了。
增加动态依赖库
link_directories(
/usr/lib/x86_64-linux-gnu/
)
target_link_libraries(${PROJECT_NAME}
libz.so
)
这里只写添加方法,后续的例子可以看到应用的实例,就不专门写个例子了。
复杂工程编写
第三方依赖库
文件结构如下: . ├── CMakeLists.txt ├── cnpy.cpp ├── cnpy.h └── main.cpp 其中cnpy需要libz.so,且该动态库系统自带。 main需要OpenCV的库,该库为三方编译,所在文件路径为: /home/freja/so_slam3rd/ 该三方库的文件结构如下所示 /home/freja/so_slam3rd/ ├── bin #文件 ├── include #头文件 ├── lib #动态库 └── share #共享库 本地待编译的文件夹的结构是一个main文件依赖cnpy文件,cnpy文件依赖libz。同时,main文件还依赖OpenCV。因此需要参照上一小节的增加依赖项。
cmake_minimum_required(VERSION 3.12)
project(npy2png)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -g")
find_package(OpenCV REQUIRED)
include_directories(
${CMAKE_PREFIX_PATH}/include
)
link_directories(
${CMAKE_PREFIX_PATH}/lib
/usr/lib/x86_64-linux-gnu/
)
add_executable(NpyToPng
cnpy.cc
main.cc
)
target_link_libraries(NpyToPng
${OpenCV_LIBS}
libz.so
)
此时,需要注意CMAKE_PREFIX_PATH是Cmake的编译选项,可以通过在cmake的时候指定CMAKE_PREFIX_PATH=“你所需的路径”。如果不嫌麻烦,OpenCV_LIBS也可以指定编译选项。但是opencv内动态库众多,避免一个一个敲键盘find_package显然是个好用法。 但是这有引来一个问题需要将该路径添加到系统路径内,也就是每次都要export到LD_LIBRARY_PATH这个环境变量中。 此时编译一遍,就需要再终端敲好几行内容;运行一遍,就需要再终端敲好几行内容。这显然不适合傻瓜编译。 因此,写个bash就是个好方法。分别写个编译和运行的bash就行。文件内容可以如下所示。 ------------build.sh------------
#!/bin/bash
CUR_DIR=$(pwd)
echo ${CUR_DIR}
CUR_PATH=/home/freja/so_slam3rd/
echo ${CUR_PATH}
rm -rf build
mkdir build
cd build
mkdir data
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CUR_PATH}
cmake -DCMAKE_PREFIX_PATH=${CUR_PATH} ..
make
------------run.sh------------
#!/bin/bash
CUR_PATH=/home/freja/so_slam3rd/
echo ${CUR_PATH}
cd build
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CUR_PATH}
./NpyToPng
注:
嵌套编译(多文件夹)
|