問題:最近在寫一個工程的時候需要用到python3,但是由於引入了ROS相關的環境,導致希望使用python3的那部分代碼一直默認使用ROS中的python2,這樣環境就不對了。
解決的方法:很順理成章的想法是為需要python3的那部分代碼專門指定一個python3的環境,這需要在cmakelist中單獨指出
大伙可能經常見到一些開源的工程中存在多個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了,關於其如何編寫可以看看我之前的文章。
子庫中的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})
如我在之前的文章所講,這邊建議寫一個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的影響啦。舉一反三,當需要其他依賴的多版本環境時同樣可以使用以上方法。
Catalog One 、 Full code displ
如果你的django項目出現了此問題,並且搜尋了大量的博客尋