程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

[工程編寫]cmakelist多版本python環境編寫

編輯:Python

問題:最近在寫一個工程的時候需要用到python3,但是由於引入了ROS相關的環境,導致希望使用python3的那部分代碼一直默認使用ROS中的python2,這樣環境就不對了。
解決的方法:很順理成章的想法是為需要python3的那部分代碼專門指定一個python3的環境,這需要在cmakelist中單獨指出

方法

多目錄CmakeLists.txt

大伙可能經常見到一些開源的工程中存在多個CmakeLists.txt,這麼做的目的本質上是將代碼分成好多塊,每一塊有一個單獨CmakeLists.txt管理,最後只需一個總的CmakeLists.txt進行匯總即可。注意:此處掌管一塊代碼的CmakeLists.txt即可完成我們希望的功能。最簡單的例子如下,我們有一個hello庫+一個world庫,他們倆又匯總成一個最終代碼庫,就有如下的工程目錄結構:

而我們希望控制其中一個代碼塊的python版本並在主文件中調用這部分代碼,我建議的代碼格式為:
project_name/
——cmake
——sub_project_name.cmake
—— include
——src
——CmakeLists.txt(主)
——third_party
——sub_project_name
——include
——src
——CmakeLists.txt(子)
以上結構中,project_name為主文件夾,sub_project_name為我們希望控制python版本代碼的代碼塊所在的子文件夾中,我們將他放在third_party中方便管理。接下來就要編寫CmakeLists.txt了,關於其如何編寫可以看看我之前的文章。

指定子庫CmakeLists.txt中python版本

子庫中的CmakeList.txt寫法和正常情況基本相同,只不過將add_executable替換為了add_library,我們要在其中准確地指定python版本

cmake_minimum_required(VERSION 3.12.0)
project(CallAPI)
set( CMAKE_CXX_FLAGS "-std=c++14 -O3" )
SET(Python3_INCLUDE_DIRS "/usr/include/python3.6m")
SET(Python3_LIBRARIES "/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6.so")
SET( PYTHON_EXECUTABLE /usr/bin/python3.6)
# find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
message("Python3: " ${
Python3_INCLUDE_DIRS})
message("Python3: " ${
Python3_LIBRARIES})
include_directories(./include/ ${
Python3_INCLUDE_DIRS})
add_library(libCallAPI src/call_api.cpp)
target_link_libraries(libCallAPI ${
Python3_LIBRARIES})

主CmakeLists.txt中連接子庫

如我在之前的文章所講,這邊建議寫一個sub_project_name.cmake文件來連接庫,以我寫的CallAPI庫為例,.cmake內容如下

add_subdirectory(${
PROJECT_SOURCE_DIR}/thirdparty/CallAPI)
include_directories(${
PROJECT_SOURCE_DIR}/thirdparty/CallAPI/include/)
list(APPEND ALL_TARGET_LIBRARIES libCallAPI)

有了.cmake文件,在主CmakeLists.txt中只需要應用一下這個文件即可

...其他內容...
include(cmake/callapi.cmake)
...其他內容...

總結

如上,sub_project_name庫的python版本就是你特定的那個版本,不會收到主或者其他CmakeLists.txt的影響啦。舉一反三,當需要其他依賴的多版本環境時同樣可以使用以上方法。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved