前言:
在工程应用中,经常会遇到将所需的函数以动态库和头文件的方式被其他工程师调用,这里将通过一个简单的例子来说明一下该操作的实现过程。
教程:
一、工程目录:
.
├── 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;
}