cmake-examples/01-basic/D-shared-library at master · ttroy50/cmake-examples · GitHub
一、说明
如何用CMake编译动态链接库,重要的是CMakeLists.txt如何配置?本篇将就这个主题进行探索。用具体案例演示这个编译过程。
二、用案例进行说明
2.1 CMakeLists.txt的基本设置
include_directories(${CMAKE_SOURCE_DIR}/inc)
link_directories(${CMAKE_SOURCE_DIR}/lib)
add_executable(foo ${FOO_SRCS})
target_link_libraries(foo bar) # libbar.so is found in ${CMAKE_SOURCE_DIR}/lib
2.2 案例和实现
本例显示了一个 hello world 示例,该示例首先创建并链接了一个共享库。
这还显示了如何创建别名目标
本教程中的文件如下:
$ tree
.
├── CMakeLists.txt
├── include
│ └── shared
│ └── Hello.h
└── src
├── Hello.cpp
└── main.cpp
-
CMakeLists.txt - -- 包含您希望运行的 CMake 命令
-
include/shared/Hello.h -- 要包含的头文件
-
src/Hello.cpp --- 要编译的源文件
-
src/main.cpp - 带有 main 的源文件
三、如何添加共享库
与前面关于静态库的示例一样,add_library() 函数也用于从一些源文件创建共享库。这被称为如下:
add_library(hello_library SHARED src/Hello.cpp )
这将用于创建一个名为 libhello_library.so 的共享库,并将源传递给 add_library() 函数。
四、目标别名 Target
顾名思义,别名目标是目标的替代名称,可以在只读上下文中代替真实目标名称。
add_library(hello::library ALIAS hello_library)
如下所示,这允许您在将目标链接到其他目标时使用别名来引用目标。
五、连接动态链接库-Linking a Shared Library
链接共享库与链接静态库相同。创建可执行文件时,使用 target_link_library() 函数指向您的库
add_executable(hello_binary src/main.cpp ) target_link_libraries(hello_binary PRIVATE hello::library )
这告诉 CMake 使用别名目标名称将 hello_library 与 hello_binary 可执行文件链接起来。
链接器调用的一个例子是
/usr/bin/c++ CMakeFiles/hello_binary.dir/src/main.cpp.o -o hello_binary -rdynamic libhello_library.so -Wl,-rpath,/home/matrim/workspace/cmake-examples/01-basic/D-shared-library/build
六、编译工程
$ 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/D-shared-library/build $ make Scanning dependencies of target hello_library [ 50%] Building CXX object CMakeFiles/hello_library.dir/src/Hello.cpp.o Linking CXX shared library libhello_library.so [ 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.so Makefile $ ./hello_binary Hello Shared Library!