有些時候我們需要將部分代碼編譯成單獨的一個庫,然後在另一個項目中去使用這個庫
大部分是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引入,就可以實現對代碼函數的調用