g++编译
g++ helloSLAM.cpp
在当前目录生成a.out
可执行文件
a.out在终端中
./a.out
运行,直接右键无法执行控制台程序
g++ helloSLAM.cpp -o helloSLAM
指定输出可执行文件的名称为helloSLAM
cmake
通常一个项目包含多个类,要满足各个类之间的依赖关系,还要区分可执行文件和库文件,g++的命令将变得很长且容易出错。CSAPP中有详细讲解。
于是makefile自动编译,当项目更大更复杂时,用cmake工具生成makefile。
标准步骤:
mkdir build #编译输出文件夹
cd build
cmake .. #生成makefile
make #编译
sudo make install #安装(默认/usr/local)
编写CMakeLists.txt
#声明cmake工具最低版本
cmake_minimum_required(VERSION 3.14)
#声明cmake工程,与源程序名称无关
project(ch2)
#定义变量 C++标准版本
set(CMAKE_CXX_STANDARD 14)
#添加可执行程序 指定名称
add_executable(helloSLAM helloSLAM.cpp)
#将cpp源程序编译成名为hello的库,输出`libhello.a`静态库文件
add_library(hello libHelloSLAM.cpp)
#共享库,得到libhello_shared.so
add_library(hello_shared SHARED libHelloSLAM.cpp)
#静态库每次使用都会生成一个副本,共享库只有一个
#编写头文件,引用头文件就可以使用库里的函数,如果不在同一目录需要指定库文件目录include_directories()
add_executable(useLibHello useLibHello.cpp)
target_link_libraries(useLibHello hello_shared)#文件名为libhello_shared.so
将工程文件夹规范化,创建四个子文件夹:src,bin,include,lib。修改CMakeLists.txt
#声明cmake工具最低版本
cmake_minimum_required(VERSION 3.5.1)
#声明cmake工程,与源程序名称无关 隐式定义<project>_BINARY_DIR 和<project>_SOURCE_DIR 两个变量 ${变量名}使用变量
project(ch2)
#定义变量 C++标准版本
set(CMAKE_CXX_STANDARD 14)
#可执行文件生成目录
set( EXECUTABLE_OUTPUT_PATH ${ch2_SOURCE_DIR}/bin )
#库文件生成目录
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib )
#添加可执行程序 指定名称
add_executable(helloSLAM ${PROJECT_SOURCE_DIR}/src/helloSLAM.cpp)
#将cpp源程序编译成名为hello的库,生成libhello.a静态库
add_library(hello ${PROJECT_SOURCE_DIR}/src/libHelloSLAM.cpp)
#共享库,得到libhello_shared.so
add_library(hello_shared SHARED ${PROJECT_SOURCE_DIR}/src/libHelloSLAM.cpp)
#静态库每次使用都会生成一个副本,共享库只有一个
#编写头文件,引用头文件就可以使用库里的函数,如果不在同一目录需要指定库文件目录include_directories()
add_executable(useLibHello ${PROJECT_SOURCE_DIR}/src/useLibHello.cpp)
target_link_libraries(useLibHello hello_shared)#文件名为libhello_shared.so
include_directories(${ch2_SOURCE_DIR}/include)#添加头文件目录