介绍
显示了一个helloworld示例,该示例首先创建并链接了一个静态库。这是一个简化的示例,显示了库和二进制文件在同一个文件夹中。
本教程中的文件包括:
$ tree
.
├── CMakeLists.txt
├── include
│ └── static
│ └── Hello.h
└── src
├── Hello.cpp
└── main.cpp
- CMakeLists.txt - 包含要运行的CMake命令
- include/Hello.h - 头文件
- src/Hello.cpp - 资源文件
- src/main.cpp - main文件
概念
添加一个静态库
add_library( )函数用来从源文件创造一个库,调用方法如下:
add_library(hello_library STATIC
src/Hello.cpp
)
这将用于创建一个名为libhello_library.a的静态库,其中包含add_library调用中的源。
如前一个示例中所述,我们将源文件直接传递给add_library调用,这是现代CMake的建议。
添加头文件目录
在这个实例中,我们使用target_include_directories()函数将范围设置为PUBLIC。
target_include_directories(hello_library
PUBLIC
${PROJECT_SOURCE_DIR}/include
)
这将使在以下位置使用包含的目录:
当编译链接库的任何其他目标时。
编译库
作用域的含义是:
- PRIVATE-目录被添加到此目标的include目录中。
- INTERFACE-该目录将添加到链接此库的任何目标的include目录中。
- PUBLIC-如上所述,它包含在这个库中,也包含在链接此库的任何目标中。
在使用target_include_directories( )函数后,c++文件只需要引入相对路径即可,这有效避免了文件引用冲突。如:
#include "static/Hello.h"
链接库
当创建一个使用你的库的可执行文件时,你必须告诉编译器关于这个库的信息。这可以使用target_link_libraries()函数完成。
add_executable(hello_binary
src/main.cpp
)
target_link_libraries( hello_binary
PRIVATE
hello_library
)
在二进制文件进行链接时告诉cmake去链接hello_library。它还将从链接库目标传播任何具有公共或接口作用域的include目录。
编译器调用的一个例子:
/usr/bin/c++ CMakeFiles/hello_binary.dir/src/main.cpp.o -o hello_binary -rdynamic libhello_library.a
构建例子
$ mkdir build
$ cd build
$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/matrim/workspace/cmake-examples/01-basic/C-static-library/build
$ make
Scanning dependencies of target hello_library
[ 50%] Building CXX object CMakeFiles/hello_library.dir/src/Hello.cpp.o
Linking CXX static library libhello_library.a
[ 50%] Built target hello_library
Scanning dependencies of target hello_binary
[100%] Building CXX object CMakeFiles/hello_binary.dir/src/main.cpp.o
Linking CXX executable hello_binary
[100%] Built target hello_binary
$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake hello_binary libhello_library.a Makefile
$ ./hello_binary
Hello Static Library!