網站首頁 編程語言 正文
對于新一代的編程語言Java、Python,當編譯、運行時需要第三方的庫,可以用語言自帶的工具,下載這些依賴庫,級聯依賴的庫也會被下載,部署時也會去下載或者用之前下載的。
而C/C++編譯、運行時,可以鏈接操作系統里的動態庫,這些庫的下載需要手工執行yum,部署時也需要這樣安裝依賴庫。
C/C++與Java、Python都有庫依賴問題,但是C/C++語言沒有自帶的包管理機制,也許是因為C/C++更多的應用于系統程序領域,Java、Python更多用于應用程序領域,對快速開發和部署要求更高。
不過現在逐漸進化出C/C++的依賴管理工具,C/C++的編譯部署也可以像Java、Python那樣。
這個工具就是conan,當然還有別的C/C++依賴管理工具,不過我試用了一下conan,還是挺好用的。
下面用Getting Started — conan 1.56.0 documentation
的例子說明,這個例子編譯一個cpp程序:
#include "Poco/MD5Engine.h"
#include "Poco/DigestStream.h"
#include <iostream>
int main(int argc, char** argv){
Poco::MD5Engine md5;
Poco::DigestOutputStream ds(md5);
ds << "abcdefghijklmnopqrstuvwxyz";
ds.close();
std::cout << Poco::DigestEngine::digestToHex(md5.digest()) << std::endl;
return 0;
}
這個程序用到了poco/1.9.4這個庫,我們的方法是用conan下載,然后用cmake編譯。
一、下載conan
這個conan是個Python3程序,它的獲取可以通過pip install,例如:
pip install conan
二、下載/安裝C/C++依賴庫
當我們要編譯的C/C++程序需要依賴某個庫時,有了conan的包管理,不再需要在操作系統上用yum安裝了,而是用conan install命令,這個命令會尋找conanfile.txt,然后安裝里面指定的庫:
[requires]
poco/1.9.4[generators]
cmake
?[requires]段指定要安裝的庫/包的名稱,[generators]指定為哪編譯工具生成配置文件,這里生成cmake的配置文件,其中包括編譯時使用這些庫的編譯選項。
然后在conanfile.txt所在目錄下執行
conan install .
這一步生成了conanbuildinfo.cmake
三、編譯時使用依賴庫
如何在編譯時使用之前下載的依賴庫呢?
之前的conan install,在下載了依賴庫時,也創建了cmake配置,只要把這些配置添加到cmake工程中,就可以在編譯時使用這些依賴庫了。
例如,創建CMakeLists.txt,內容如下:
cmake_minimum_required(VERSION 2.8.12)
project(MD5Encrypter)
add_definitions("-std=c++11")
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
add_executable(md5 md5.cpp)
target_link_libraries(md5 ${CONAN_LIBS})
對于版本大于5.1的GCC編譯器,執行下面的命令,否則連接時會出錯:
conan profile new default --detect # Generates default profile detecting GCC and sets old ABIconan profile update settings.compiler.libcxx=libstdc++11 default
然后在CMakeLists.txt所在目錄,執行:
cmake .
make
在bin目錄下生成md5可執行文件,這個可執行的文件是靜態鏈接poco庫的,用這種方法編譯的可執行文件都是靜態鏈接conan下載的庫的。
原文鏈接:https://blog.csdn.net/howard_shooter/article/details/128646577
相關推薦
- 2022-04-29 通過C#程序操作Config文件_C#教程
- 2022-06-07 victoriaMetrics代理性能優化問題解析_數據庫其它
- 2022-05-09 Python數據結構與算法中的棧詳解(1)_python
- 2022-06-26 Python使用Tkinter?GUI實現輸入驗證功能_python
- 2022-07-17 oracle數據庫去除重復數據常用的方法總結_oracle
- 2022-04-12 git 提交到遠程倉庫 報錯 error: failed to push some refs to
- 2022-07-10 CSS解決未知高度垂直居中
- 2022-08-30 python中Requests請求的安裝與常見用法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支