【WIN32】CMake的学习总结 5——编译完整的动/静态库

来源:互联网 发布:hantaioppai新域名 编辑:程序博客网 时间:2024/05/16 14:33

目录结构

+|+--- CMakeLists.txt+--+ bin+--+ lib+--+ src|  +--- test.cpp|  +--- CMakeLists.txt+--+ xmath|  +--- xmath.h|  +--- xmath.cpp|  +--- xmath.def|  +--- CMakeLists.txt+--+ build

以下为C++的源代码

子目录xmath:xmath/xmath.h 代码如下:

#ifndef XMATH_H#define XMATH_Hdouble addition(double v1, double v2);double multiple(double v1, double v2);#endif // XMATH_H

子目录xmath:xmath/xmath.cpp 代码如下:

#include "xmath.h"double addition(double v1, double v2){    return v1 + v2;}double multiple(double v1, double v2){    return v1 * v2;}

子目录xmath:xmath/xmath.def 代码如下:

LIBRARY "libxmath"EXPORTS    addition    multiple

子目录src:src/test.cpp代码如下:

#include <stdio.h>#include <stdlib.h>#include <iostream>#include <xmath.h>int main(int argc, char **argv){    if(argc < 3){        fprintf(stdout, "%s输入的参数不足2个,程序终止!", argv[0]);        return 1;    }    double val1 = addition(atof(argv[1]), atof(argv[2]));    double val2 = multiple(atof(argv[1]), atof(argv[2]));    fprintf(stdout, "addition(%s, %s) is %g\n", argv[1], argv[2], val1);    fprintf(stdout, "multiple(%s, %s) is %g\n", argv[1], argv[2], val2);    return 0;}

C++源代码完成后,将在CMakeLists.txt中编写CMake的命令

主目录: CMakeLists.txt

########################################## Project(关于工程信息)#########################################cmake_minimum_required(VERSION 3.0)project(XMath)                   # 添加工程名称(默认为Project)add_subdirectory(xmathlib)       # 添加库的子目录add_subdirectory(src)            # 添加测试的子目录

子目录xmath: xmath/CMakeLists.txt

set (major_version 1)set (minor_version 0)set (patch_version 0)set (build_version 0)set (version ${major_version}.${minor_version}.${patch_version})########################################## Source(关于源文件)#########################################set(file_inc xmath.h)                   # 头文件set(file_src xmath.cpp)                 # 源文件set(lib_name "xmath")                   # 库名称set(lib_name_static ${lib_name}-static) # 静态库的名称set(lib_name_shared ${lib_name}-shared) # 动态库的名称# WIN32下添加def文件if(WIN32)set(file_src ${file_src} xmath.def)     # 源文件添加xmath.defendif()########################################## Target(关于目标文件)########################################## 添加静态库add_library(${lib_name_static}          # 静态库名称        STATIC                          # 静态库FLAG        ${file_inc} ${file_src}         # 库的源文件        ) # 添加动态库add_library(${lib_name_shared}          # 动态库名称        SHARED                          # 动态库标识        ${file_inc} ${file_src}         # 源文件    )# WIN32平台添加前缀lib(UNIX为默认lib前缀的)if(WIN32)set(lib_name lib${lib_name})            # 添加前缀libendif()# 设置静态库的属性set_target_properties(${lib_name_static}        PROPERTIES         OUTPUT_NAME_DEBUG ${lib_name}d  # DEBUG下生成的库名称libxmathd.lib        OUTPUT_NAME ${lib_name}         # 非DEBUG生成的库名称libxmath.lib        )# 设置动态库的属性set_target_properties(${lib_name_shared}        PROPERTIES         OUTPUT_NAME ${lib_name}         # 重名命生成的库名称libxmath.lib        SOVERSION ${major_version}      # 设置函数API版本        VERSION ${version}              # 设置动态库版本        )# 设置库的输出路径set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

子目录src: src/CMakeLists.txt

########################################## Build(关于依赖库)#########################################set(dir_src test.cpp)set(exe_name test)# xmath库头文件所在目录set(lib_inc ${PROJECT_SOURCE_DIR}/xmathlib CACHE PATH "include of xmath")# xmath库文件所在目录set(lib_dir ${PROJECT_SOURCE_DIR}/lib CACHE PATH "directory of math.lib")# 在这里动态库与静态库的设置是一样的# 指定头文件的搜索路径include_directories(${lib_inc})# 指定库文件的搜索路径link_directories(${lib_dir})########################################## Target(关于目标文件)########################################## 添加可执行文件Testadd_executable(${exe_name} ${dir_src})# 设置可执行文件输出目录set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)# 简单使用动态库与静态库,全场唯一的不同就在这里# 链接库(动态库)target_link_libraries(${exe_name} libxmath.dll)# 链接库(静态库)# target_link_libraries(${exe_name} libxmath.lib)
0 0
原创粉丝点击