windows平台下使用cmake构建静态lib库以及使用静态lib库&gtest项目

有些时候我们需要将部分代码编译成单独的一个库,然后在另一个项目中去使用这个库

大部分是linux环境下的指令,但是也差不是很多

记录一下构建的经过

 

目录

1.使用cmake构建及使用lib库

构建lib库

使用lib库 

2.被测项目编译成库文件,结合gtest框架在测试项目中调用函数并输出


1.使用cmake构建及使用lib库

构建lib库

  • 最终目录展示

  • 下面给出libhello目录下的源代码

头文件hello.h

#ifndef HELLO_H
#define HELLO_H
void hello();
#endif

源文件hello.cpp

#include<stdio.h>
#include"hello.h"

void hello()
{
      printf("hello world!\n");
}

cmakelists.txt

cmake_minimum_required (VERSION 2.6)
project(hello)

#//生成动态库(SHARED)
add_library(hello  ${PROJECT_SOURCE_DIR}/libhello/hello.cpp)
#add_library(hello SHARED ${PROJECT_SOURCE_DIR}/libhello/hello.cpp)

#//安装文件到目录下
#install(TARGETS hello RUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/lib)
#install(FILES "${PROJECT_SOURCE_DIR}/libhello/hello.h" DESTINATION "${PROJECT_SOURCE_DIR}/include")

注释掉的那一行是动态库,因为我后面引入动态库有点问题,所以就引入的是静态库

 

如果不知道怎么生成编译项目,见下面这个链接 

https://blog.csdn.net/yysave/article/details/96434908 

编译生成后,在debug目录下 

dll是动态库,lib是静态库,后面使用的时候我用的是静态库

理论上使用动态库就可以,占内存也小。lib是编译时用到的,dll是运行时用到的。下面这篇文章是windows下dll与lib的区别

https://www.cnblogs.com/alantu2018/p/8470976.html

 我两个库都生成保存了

使用lib库 

先给出最后的目录图(因为我怕中间某个链接找不到出问题,所以把ilk pdb文件都拷过来了)

首先先说lib文件夹,里面放的是

 

然后是cmakelists.txt

 

cmake_minimum_required (VERSION 2.6)
project(usehellolib)

# 需包含的库文件
link_directories(
   D:/Test-my/gtest/demo5/Use_lib/lib
)
#//生成可执行文件
add_executable(usehellolib usehellolib.cpp)

#//链接库到可执行文件
target_link_libraries(usehellolib hello)

然后是hello.h,和前面生成lib中的一模一样,为什么需要这个头文件呢,因为在后面的cpp文件中要使用到头文件,因为库里面是函数的实现,函数的定义还在头文件中(网上是这么说的)

 usehellolib.cpp

# include <iostream>
#include "hello.h"
int main()
{
  hello();
  system("PAUSE");
  return 0;
}

 生成项目,编译之后,在debug目录下会有执行文件

 

 点击运行就可以了。至此,我们实现了在一个项目中编译成库文件,在另一个项目中调用库文件中的函数并输出的功能

 

2.被测项目编译成库文件,结合gtest框架在测试项目中调用函数并输出

首先,不是很清楚gtest项目的先看前面我写过的两篇文章

gtest单元测试配置+vs 2015+OpenCppCoverage输出测试覆盖率 || cmake命令构建项目以及编译以及命令行测试

Cmakelists配置多级目录的gtest项目(项目代码和测试代码分离)

  •  首先,新建一个项目,将原先libhello文件夹中的内容换成下面这两个文件,代码见上面链接中

生成项目,编译,同样得到lib库(适当改写cmakelists.txt,就是改改cpp名字)

标题

 

 将库文件拷到下面目录中

 适当改写

 因为cmakelists.txt改动比较大,所以给出修改后版本

cmake_minimum_required (VERSION 3.6)

include_directories(D:/Test-my/gtest/demo5-2/Use_lib/googletest-release-1.7.0/googletest-release-1.7.0/include)
project(gtestusemyAddlib)

# 需包含的库文件
link_directories(
   D:/Test-my/gtest/demo5-2/Use_lib/lib
D:/Test-my/gtest/demo5-2/Use_lib/googletest-release-1.7.0/googletest-release-1.7.0/lib
)

ADD_SUBDIRECTORY(D:/Test-my/gtest/demo5-2/Use_lib/googletest-release-1.7.0/googletest-release-1.7.0)
find_package(Threads)
#//生成可执行文件
add_executable(gtestusemyAddlib test_calc.cpp)

#//链接库到可执行文件
TARGET_LINK_LIBRARIES(gtestusemyAddlib gtest gtest_main)
TARGET_LINK_LIBRARIES(gtestusemyAddlib hello)

#这个必须放在project的后面
IF(MSVC)
   message("run here")
   set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
endif()

经常出现的问题是,静态动态不匹配的问题,那么就需要将if(msvc)这一块加到每一个cmake文件中

注意,是每一个,也就是说,前面编译的lib就需要重新编译

否则不能用,各种报错

还有一个经常出现的问题,比如gtest/gtest.h找不到,那就是说你没有加入add_subdirectory这个指令 

最后执行结果

 

至此,就可以将此项目作为一个单纯的gtest项目

将被测代码编译成lib库文件,只用将库文件lib和头文件.h引入,就可以实现对代码函数的调用 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章