windows平台下使用cmake构建静态lib库以及使用静态lib库>est项目
有些时候我们需要将部分代码编译成单独的一个库,然后在另一个项目中去使用这个库大部分是linux环境下的指令,但是也差不是很多记录一下构建的经过目录1.使用cmake构建及使用lib库构建lib库使用lib库2.被测项目编译成库文件,结合gtest框架在测试项目中调用函数并输出1.使用cmake构建及使用lib库构建lib库最终目录展示下面给...
有些时候我们需要将部分代码编译成单独的一个库,然后在另一个项目中去使用这个库
大部分是linux环境下的指令,但是也差不是很多
记录一下构建的经过
目录
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引入,就可以实现对代码函数的调用
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)