CMake 编译静态库和动态库

原文: http://blog.csdn.net/yangfeng2014/article/details/50614406


本帖子适用于初学者,StepByStep的入门CMake,CMake也是一门编程语言,只不过是针对编译和链接这种程序构建的过程的语言,学习基本语法就可以初步入门,后面需要什么复杂的功能,进阶掌握需要自己去查找官方文档,后续会给出查阅的一些方式

软件平台

  • Win 7
  • VMware Workstation 12 Pro
  • Ubuntu 15.10
  • CMake 3.2.2

case 4

目录结构

+
| 
+--- CMakeLists.txt
/--+ src/
   |
   +--- CMakeLists.txt
   /--+ hellolib/
      |
      +--- CMakeLists.txt  
      /--+ include/
         |
         +--- hello.h 
      /--+ src/
         |
         +--- hello.cpp      
|
/--+ build/
   |
   /--+ lib/
      |
      +--- libhello.so
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

文件内容

//   /CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(src)
 
 
  • 1
  • 2
  • 3
  • 4
//  /src/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
ADD_SUBDIRECTORY(hellolib)

 
 
  • 1
  • 2
  • 3
  • 4
//  /src/hellolib/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/lib")
AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src/hellolib/src HELLOlib_src)
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/src/hellolib/include")
ADD_LIBRARY(hello SHARED ${HELLOlib_src})
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
//  /src/hellolib/include/hello.h
# ifndef HELLO_H
# define HELLO_H
# include <iostream>
void HelloFunc();
# endif
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
//  /src/hellolib/src/hello.cpp
# include "hello.h"

using namespace std;

void HelloFunc(){
    cout<<"Hello My Linux !"<<endl;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

语法解释

ADD_LIBRARY(hello SHARED ${HELLOlib_src})
添加编译库命令:
SHARED,动态库,libhello.so
STATIC,静态库,libhello.a

SET(LIBRARY_OUTPUT_PATH “${PROJECT_BINARY_DIR}/lib”)
ELIBRARY_OUTPUT_PATH是cmake默认变量,修改它可以把库文件的路径修改,本例子中修改为build/lib

case 5

目录结构

+
| 
+--- CMakeLists.txt
/--+ src/
   |
   +--- CMakeLists.txt
   /--+ hellolib/
      |
      +--- CMakeLists.txt  
      /--+ include/
         |
         +--- hello.h 
      /--+ src/
         |
         +--- hello.cpp      
|
/--+ build/
   |
   /--+ lib/
      |
      +--- libhello.so
      +--- libhello.a
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

文件内容

//  /src/hellolib/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/lib")
AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src/hellolib/src HELLOlib_src)
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/src/hellolib/include")
ADD_LIBRARY(hello SHARED ${HELLOlib_src})
ADD_LIBRARY(hello_static STATIC ${HELLOlib_src})
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

#SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
#SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)

#SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

其余同case4

语法解释

INCLUDE_DIRECTORIES(“${PROJECT_SOURCE_DIR}/src/hellolib/include”)
头文件目录包含指令

SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME “hello”)
一般我们希望同时编译出静态库和动态库,并且命名一致,但是cmake的target不允许重名,所以我们把静态库命名为hello_static,然后通过上述语句修改其输出的名字,为hello,这样就可以在lib目录下生成libhello.a和lobhello.so。

SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
如果执行make后只生成了一种库,说明生成第二个库的时候删除了同名的其他库。上面的语句可以显示指定不删除同名的库。

SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
一般动态库会包含一个版本号,使用上述命令可以携带版本号:VERSION代表同太苦版本,SOVERSION指代API版本。

case 6

目录结构

+
| 
+--- CMakeLists.txt
/--+ src/
   |
   +--- CMakeLists.txt
   /--+ hellolib/
      |
      +--- CMakeLists.txt  
      /--+ include/
         |
         +--- hello.h 
      /--+ src/
         |
         +--- hello.cpp
   /--+ mycmake/
      |
      +--- CMakeLists.txt 
      /--+ src/
         |
         +--- mycmake.cpp 
|
/--+ build/
   |
   /--+ lib/
      |
      +--- libhello.so
      +--- libhello.a
   /--+ bin/
      |
      +--- mycmake
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

文件内容

//  /src/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
ADD_SUBDIRECTORY(hellolib)
ADD_SUBDIRECTORY(mycmake)

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
//  /src/mycmake/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}/bin")
AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src/mycmake/src mycmake_src)
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/src/hellolib/include")
LINK_DIRECTORIES("${PROJECT_BINARY_DIR}/lib")
ADD_EXECUTABLE(mycmake ${mycmake_src})
TARGET_LINK_LIBRARIES(mycmake libhello.a)
#TARGET_LINK_LIBRARIES(mycmake libhello.so)
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

其余同case5

语法解释

LINK_DIRECTORIES(“${PROJECT_BINARY_DIR}/lib”)
库文件目录包含指令

TARGET_LINK_LIBRARIES(mycmake libhello.a)
链接指令,链接自己编译出的静态/动态库,或者链接网上下载的外部库

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 CMake 编译动态库静态库,你可以按照以下步骤进行操作: 1. 创建一个 CMakeLists.txt 文件,该文件描述了构建过程和项目配置。 2. 在 CMakeLists.txt 文件中,使用 `add_library` 命令来定义要构建的。使用 `SHARED` 参数来指定动态库,使用 `STATIC` 参数来指定静态库。例如: ```cmake # 构建动态库 add_library(mylib SHARED src/mylib.cpp) # 构建静态库 add_library(mylib_static STATIC src/mylib.cpp) ``` 3. 如果你有多个源文件,可以将它们一起添加到中: ```cmake # 构建动态库 add_library(mylib SHARED src/mylib.cpp src/other.cpp) # 构建静态库 add_library(mylib_static STATIC src/mylib.cpp src/other.cpp) ``` 4. 如果你想为定义公共头文件目录,可以使用 `target_include_directories` 命令。例如: ```cmake target_include_directories(mylib PUBLIC include) ``` 5. 如果你希望链接其他到你的中,可以使用 `target_link_libraries` 命令。例如: ```cmake target_link_libraries(mylib PUBLIC otherlib) ``` 6. 最后,在 CMakeLists.txt 文件中添加一个 `install` 命令,以便在构建过程完成后安装文件到指定的目录。例如: ```cmake install(TARGETS mylib DESTINATION lib) install(FILES include/mylib.h DESTINATION include) ``` 7. 运行 CMake 命令来生成构建系统所需的文件: ```shell cmake . ``` 8. 使用生成的构建系统来编译和构建: ```shell make ``` 在构建过程完成后,你将在指定的目录(例如 `lib`)中找到生成的动态库静态库文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值