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引入,就可以實現對代碼函數的調用 

 

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