日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.so 依赖目录 cmake_cmake浅析

發布時間:2025/3/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .so 依赖目录 cmake_cmake浅析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

cmake前言

首先允許開發者編寫一種平臺無關的 CMakeList.txt 文件來定制整個編譯流程,然后再根據目標用戶的平臺進一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。從而做到“Write once, run everywhere”。顯然,CMake 是一個比上述幾種 make 更高級的編譯配置工具。一些使用 CMake 作為項目架構系統的知名開源項目有?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}; /* 補齊后的密鑰 */ /* 構造補齊后的密鑰 */ 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})
一次輸出多個可執行文件時

例如上文,我除了要輸出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默認環境變量
12345678910111213141516171819202122232425262728293031323334353637cmake_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++的詳細編譯信息
12make的時候, 使用如下命令:make VERBOSE=1

總結

以上是生活随笔為你收集整理的.so 依赖目录 cmake_cmake浅析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。