.so 依赖目录 cmake_cmake浅析
生活随笔
收集整理的這篇文章主要介紹了
.so 依赖目录 cmake_cmake浅析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
cmake前言
首先允許開發(fā)者編寫一種平臺無關的 CMakeList.txt 文件來定制整個編譯流程,然后再根據(jù)目標用戶的平臺進一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。從而做到“Write once, run everywhere”。顯然,CMake 是一個比上述幾種 make 更高級的編譯配置工具。一些使用 CMake 作為項目架構(gòu)系統(tǒng)的知名開源項目有?VTK、ITK、KDE、OpenCV、OSG?等 。我是受夠了手寫makefile。
cmake標準三步走
mkdir src
cd build,mkdir build, create cMakeLists.txt
cd build&& cmake ..
make clean && make
為啥呢?因為cmake不支持清空緩存=手動狗頭=。如果要刪除緩存,直接刪除build即可
cmake模板
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | # CMake 最低版本號要求cmake_minimum_required(VERSION 2.8)# 項目名稱project("cmake_test")# 添加預編譯選項, 如使用-D定義宏等等ADD_DEFINITIONS( "-DMY_BIG" "-DYOU_LITTLE")# 添加編譯選項add_compile_options( "-std=c++11" "-g3" "-Wall" "-Wextra")# 添加鏈接選項#set(CMAKE_EXE_LINKER_FLAGS "-Wl,rpath=./lib")# 添加頭文件路徑, 相當于g++的-Iinclude_directories( "./include" "./include/jansson")# 指定庫文件路徑, 相當于g++的-L(必須使用絕對路徑)link_directories( "/root/projects/cmake_test/lib")# 指定庫文件, 相當于g++的-l(必須使用絕對路徑)link_libraries( "libjansson.a")# 查找指定目錄下的所有源文件aux_source_directory("." DIR_MAIN)aux_source_directory("./func_001" DIR_FUNC_001)aux_source_directory("./func_002" DIR_FUNC_002)# 指定生成目標add_executable( "cmake_test.out" ${DIR_MAIN} ${DIR_FUNC_001} ${DIR_FUNC_002}) |
實際例子
單個源碼文件
源碼
| 123456 | #includeint main(){ printf("helloworld\n");} |
makefile
| 12345678 | # CMake 最低版本號要求cmake_minimum_required (VERSION 2.8)# 項目信息project (Helloworld)# 指定生成目標add_executable(Hellworld helloworld.c) |
運行
單個文件依賴外部頭文件
源碼
| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | #include #include #include #include#include "base64.h"#define LEN_OF_KEY 24int tripleDesDecrypt(const char * key1,const char *pInEncrypt,char *pOutDecrypt,int* outDecryptLen ){ if(NULL==key1||NULL==pInEncrypt){ return -1; } unsigned char iv[8] = { '0','0','0','0','0','0','0','0' }; DES_key_schedule des_key1; DES_key_schedule des_key2; DES_key_schedule des_key3; const_DES_cblock key_SSL1, key_SSL2, key_SSL3; DES_cblock ivec; int key_len; unsigned char key_value[LEN_OF_KEY]={0}; /* 補齊后的密鑰 */ /* 構(gòu)造補齊后的密鑰 */ key_len = strlen(key1); memcpy(key_value, key1, key_len); memset(key_value + key_len, 0, LEN_OF_KEY - key_len); memcpy(&key_SSL1, key_value, (size_t)8); memcpy(&key_SSL2, key_value+8, (size_t)8); memcpy(&key_SSL3, key_value+16, (size_t)8); DES_set_key_unchecked(&key_SSL1, &des_key1); DES_set_key_unchecked(&key_SSL2, &des_key2); DES_set_key_unchecked(&key_SSL3, &des_key3); memcpy(ivec, iv, sizeof(iv)); unsigned char nobase64_buff[1024*64]={0}; int len = 0; len= Base64Decode(pInEncrypt, strlen(pInEncrypt), (char*)nobase64_buff, sizeof(nobase64_buff), BASE64_FLAG_NO_PADDING | BASE64_FLAG_NO_WRAP | BASE64_FLAG_URL_SAFE); DES_ede3_cbc_encrypt( nobase64_buff, (unsigned char*)pOutDecrypt,len, &des_key1, &des_key2, &des_key3,&ivec,DES_DECRYPT); unsigned char buwei = pOutDecrypt[len-1]; printf("srcData=%s,buwei=%d,len=%d\n",pOutDecrypt,buwei,len); pOutDecrypt[len - buwei] = 0; *outDecryptLen=len-buwei; return 0;}int main(){ /* 加載算法 */ int outLen=0; char outData[512]={0}; tripleDesDecrypt("121221","npOUnPD1DKH1rWZ2Pgl-Iw",outData,&outLen ); printf("outData=%s\noutlen=%d\n",outData,outLen); tripleDesDecrypt("121221","yLIJLMDOiVrDnj8tX6FNeg",outData,&outLen ); printf("outData=%s\noutlen=%d\n",outData,outLen); printf("-------------2---------------\n"); tripleDesDecrypt("121221","DyORM6-lGeY",outData,&outLen ); printf("outData=%s\noutlen=%d\n",outData,outLen); tripleDesDecrypt("121221","wjJqjcnzDJKmsR3uM98f3w",outData,&outLen ); printf("outData=%s\noutlen=%d\n",outData2,outLen); return 0;} |
cmake文件
| 1234567891011121314151617181920212223242526272829 | #最低版本cmake_minimum_required(VERSION 2.8)#項目名稱project("3des_test")add_compile_options( "-g" "-Wall")include_directories( "./")link_directories( "/root/openssl")link_libraries( ":libcrypto.so")#表示當前路徑源文件aux_source_directory("." DIR_MAIN)add_executable( "3des.out" ${DIR_MAIN}) |
一次輸出多個可執(zhí)行文件時
例如上文,我除了要輸出3descbc之外,我還要輸出3des的ecb,我們可以將源碼文件放在兩個目錄下
| 12345678910111213141516171819202122232425262728293031323334 | #最低版本cmake_minimum_required(VERSION 2.8)#項目名稱project("3des_test")add_compile_options( "-g" "-Wall")include_directories( "./")link_directories( "/root/openssl")link_libraries( ":libcrypto.so")#表示當前路徑源文件aux_source_directory("." DIR_MAIN)aux_source_directory("./3desecd" DIR_ECB)add_executable( "3descbc.out" ${DIR_MAIN})add_executable( "3desecb.out" ${DIR_ECB}) |
其他
cmake默認環(huán)境變量
| 12345678910111213141516171819202122232425262728293031323334353637 | cmake_minimum_required(VERSION 3.2)message(STATUS "CMAKE_C_FLAGS = " ${CMAKE_C_FLAGS})message(STATUS "CMAKE_C_FLAGS_DEBUG = " ${CMAKE_C_FLAGS_DEBUG})message(STATUS "CMAKE_C_FLAGS_MINSIZEREL = " ${CMAKE_C_FLAGS_MINSIZEREL})message(STATUS "CMAKE_C_FLAGS_RELEASE = " ${CMAKE_C_FLAGS_RELEASE})message(STATUS "CMAKE_C_FLAGS_RELWITHDEBINFO = " ${CMAKE_C_FLAGS_RELWITHDEBINFO})message(STATUS "CMAKE_CXX_FLAGS = " ${CMAKE_CXX_FLAGS})message(STATUS "CMAKE_CXX_FLAGS_DEBUG = " ${CMAKE_CXX_FLAGS_DEBUG})message(STATUS "CMAKE_CXX_FLAGS_MINSIZEREL = " ${CMAKE_CXX_FLAGS_MINSIZEREL})message(STATUS "CMAKE_CXX_FLAGS_RELEASE = " ${CMAKE_CXX_FLAGS_RELEASE})message(STATUS "CMAKE_CXX_FLAGS_RELWITHDEBINFO = " ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})message(STATUS "CMAKE_EXE_LINKER_FLAGS = " ${CMAKE_EXE_LINKER_FLAGS})message(STATUS "CMAKE_EXE_LINKER_FLAGS_DEBUG = " ${CMAKE_EXE_LINKER_FLAGS_DEBUG})message(STATUS "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL = " ${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL})message(STATUS "CMAKE_EXE_LINKER_FLAGS_RELEASE = " ${CMAKE_EXE_LINKER_FLAGS_RELEASE})message(STATUS "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO = " ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO})message(STATUS "CMAKE_MODULE_LINKER_FLAGS = " ${CMAKE_MODULE_LINKER_FLAGS})message(STATUS "CMAKE_MODULE_LINKER_FLAGS_DEBUG = " ${CMAKE_MODULE_LINKER_FLAGS_DEBUG})message(STATUS "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL = " ${CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL})message(STATUS "CMAKE_MODULE_LINKER_FLAGS_RELEASE = " ${CMAKE_MODULE_LINKER_FLAGS_RELEASE})message(STATUS "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO = " ${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO})message(STATUS "CMAKE_SHARED_LINKER_FLAGS = " ${CMAKE_SHARED_LINKER_FLAGS})message(STATUS "CMAKE_SHARED_LINKER_FLAGS_DEBUG = " ${CMAKE_SHARED_LINKER_FLAGS_DEBUG})message(STATUS "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL = " ${CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL})message(STATUS "CMAKE_SHARED_LINKER_FLAGS_RELEASE = " ${CMAKE_SHARED_LINKER_FLAGS_RELEASE})message(STATUS "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO = " ${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO})message(STATUS "CMAKE_STATIC_LINKER_FLAGS = " ${CMAKE_STATIC_LINKER_FLAGS})message(STATUS "CMAKE_STATIC_LINKER_FLAGS_DEBUG = " ${CMAKE_STATIC_LINKER_FLAGS_DEBUG})message(STATUS "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL = " ${CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL})message(STATUS "CMAKE_STATIC_LINKER_FLAGS_RELEASE = " ${CMAKE_STATIC_LINKER_FLAGS_RELEASE})message(STATUS "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO = " ${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO}) |
CMake顯示gcc/g++的詳細編譯信息
| 12 | make的時候, 使用如下命令:make VERBOSE=1 |
總結(jié)
以上是生活随笔為你收集整理的.so 依赖目录 cmake_cmake浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell 拷贝 一个目录下的所有文件
- 下一篇: springboot整合hibernat