CMAKE之动态库的生成与调用

前言:

在工程应用中,经常会遇到将所需的函数以动态库和头文件的方式被其他工程师调用,这里将通过一个简单的例子来说明一下该操作的实现过程。

教程:

一、工程目录:

.
├── build
├── CMakeLists.txt 
├── module
│   ├── CMakeLists.txt
│   ├── include
│   │   └── utils
│   │       └── utils.h
│   └── src
│       └── utils
│           └── utils.cpp
└── process
    ├── CMakeLists.txt
    ├── include
    └── src
        └── main.cpp

9 directories, 6 files

二、文件解析:

1.CMakeLists.txt(./)

# 指定CMake版本
cmake_minimum_required(VERSION 3.5)

# 判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持
if(CMAKE_COMPILER_IS_GNUCC)
    message("COMPILER IS GNUCC")
    add_definitions(-std=c++11 )
endif(CMAKE_COMPILER_IS_GNUCC)

# C++ 调试编译时使用的标志
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -ggdb3")
# C++ 发行编译时使用的标志
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

# 加载并处理一个子文件夹下的 CMakeLists.txt 文件
add_subdirectory(${CMAKE_SOURCE_DIR}/module)
add_subdirectory(${CMAKE_SOURCE_DIR}/process)

2.CMakeLists.txt(./module/)

# 指定CMake版本
cmake_minimum_required(VERSION 3.5)
# 指定项目名称
project(module)

# 判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持
if(CMAKE_COMPILER_IS_GNUCC)
    message("COMPILER IS GNUCC")
    add_definitions ( -std=c++11 )
endif(CMAKE_COMPILER_IS_GNUCC)

# C++ 调试编译时使用的标志
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -ggdb3")
# C++ 发行编译时使用的标志
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

# 指定头文件目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/utils)
# 指定源文件目录
file(GLOB_RECURSE SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)

# 打印cmake当前目录地址&源文件目录地址
message(${CMAKE_CURRENT_SOURCE_DIR})
message(${SOURCE_FILES})

# 设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,
# 但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
set(ALL_SRCS ${SOURCE_FILES})
message(${ALL_SRCS})

# 生成so包
# SHARED ->生成动态库
# STATIC ->生成静态库
message(${PROJECT_NAME} )
add_library(${PROJECT_NAME} SHARED ${ALL_SRCS})

3.utils.h

#ifndef __UTILS_H__
#define __UTILS_H__

#include <iostream>

class Utils {
    private:

    public:
        static void print(std::string str);
};

void print(std::string str);

#endif

4.utils.cpp

#include "utils.h"

void Utils::print(std::string str) {
    std::cout << "utils print:" << str << std::endl;
}

void print(std::string str) {
    std::cout << "print:" << str << std::endl;
}

5.CMakeLists.txt(./process/)

# 指定CMake版本
cmake_minimum_required(VERSION 3.5)

# 指定项目名称
project(hello)

# 判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持
if(CMAKE_COMPILER_IS_GNUCC)
    message("COMPILER IS GNUCC")
    add_definitions ( -std=c++11 )
endif(CMAKE_COMPILER_IS_GNUCC)

# C++ 调试编译时使用的标志
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -ggdb3")
# C++ 发行编译时使用的标志
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

# 指定头文件目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${CMAKE_SOURCE_DIR}/module/include/utils)

# 指定源文件目录
file(GLOB_RECURSE SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
message(${CMAKE_CURRENT_SOURCE_DIR})
message(${SOURCE_FILES})

# 设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,
# 但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
set(ALL_SRCS ${SOURCE_FILES})
message(${ALL_SRCS})

# 添加该工程编译时所需的依赖库
# 依赖库所在路径
link_directories(${CMAKE_BINARY_DIR}/module)
# 链接依赖库
link_libraries(module)

# 添加该工程编译完成后的可执行文件
add_executable(${PROJECT_NAME} ${ALL_SRCS})

6.main.cpp

#include <iostream>
#include "utils.h"

int main() {
    std::string str = "hello";
    Utils::print(str);
    print(str);
    std::cout << "hellow world!" << std::endl;
    return 0;
}

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值