介紹
顯示了一個helloworld示例,該示例首先創(chuàng)建并鏈接了一個靜態(tài)庫挪丢。這是一個簡化的示例莽鸭,顯示了庫和二進(jìn)制文件在同一個文件夾中。
本教程中的文件包括:
$ 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文件
概念
添加一個靜態(tài)庫
add_library( )函數(shù)用來從源文件創(chuàng)造一個庫吃靠,調(diào)用方法如下:
add_library(hello_library STATIC
src/Hello.cpp
)
這將用于創(chuàng)建一個名為libhello_library.a的靜態(tài)庫硫眨,其中包含add_library調(diào)用中的源。
如前一個示例中所述,我們將源文件直接傳遞給add_library調(diào)用礁阁,這是現(xiàn)代CMake的建議巧号。
添加頭文件目錄
在這個實例中,我們使用target_include_directories()函數(shù)將范圍設(shè)置為PUBLIC姥闭。
target_include_directories(hello_library
PUBLIC
${PROJECT_SOURCE_DIR}/include
)
這將使在以下位置使用包含的目錄:
當(dāng)編譯鏈接庫的任何其他目標(biāo)時丹鸿。
編譯庫
作用域的含義是:
- PRIVATE-目錄被添加到此目標(biāo)的include目錄中。
- INTERFACE-該目錄將添加到鏈接此庫的任何目標(biāo)的include目錄中棚品。
- PUBLIC-如上所述靠欢,它包含在這個庫中,也包含在鏈接此庫的任何目標(biāo)中铜跑。
在使用target_include_directories( )函數(shù)后门怪,c++文件只需要引入相對路徑即可,這有效避免了文件引用沖突锅纺。如:
#include "static/Hello.h"
鏈接庫
當(dāng)創(chuàng)建一個使用你的庫的可執(zhí)行文件時掷空,你必須告訴編譯器關(guān)于這個庫的信息。這可以使用target_link_libraries()函數(shù)完成囤锉。
add_executable(hello_binary
src/main.cpp
)
target_link_libraries( hello_binary
PRIVATE
hello_library
)
在二進(jìn)制文件進(jìn)行鏈接時告訴cmake去鏈接hello_library坦弟。它還將從鏈接庫目標(biāo)傳播任何具有公共或接口作用域的include目錄。
編譯器調(diào)用的一個例子:
/usr/bin/c++ CMakeFiles/hello_binary.dir/src/main.cpp.o -o hello_binary -rdynamic libhello_library.a
構(gòu)建例子
$ 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!