在研究 RDKit 的一些算法的時(shí)候,總希望能夠“進(jìn)入到代碼中”看這些變量到底是什么,哪些代碼塊會(huì)被執(zhí)行。可 RDKit 的編譯比較復(fù)雜,如果是 Python 的部分,那么可以直接在 VSCode 中進(jìn)行調(diào)試,記得在 launch 中設(shè)置 “justMyCode: false",詳見該問題。但如果想要調(diào)試 C++ 的部分,則就復(fù)雜很多,需要是用調(diào)試模式重新編譯 RDKit 的源碼。對于沒有用過VSCode 編譯 C++ 項(xiàng)目的小伙伴來說,這里有很多坑需要踩。
這個(gè)過程可以分為三個(gè)部分:安裝 RDKit 所需環(huán)境,安裝 VSCode 相應(yīng)插件, 寫調(diào)試代碼編譯
安裝 RDKit 所需環(huán)境
源碼安裝 RDKit 一直是一件麻煩事,在過去我們不得不自己安裝所需依賴,包括 Numpy,Boost,CMake 好在現(xiàn)在有了 Anaconda,讓安裝依賴變得省心很多。不過 Anaconda 也是把雙刃劍,筆者遇到由于不同環(huán)境被 CMake 混亂使用導(dǎo)致一些潛在的問題,這個(gè)在最后提到。
我們可以參考 RDKit 官方文檔進(jìn)行環(huán)境安裝 https://www.rdkit.org/docs/Install.html#how-to-build-from-source-with-conda
筆者使用 MacOS 測試,而且已經(jīng)安裝上了 Anaconda,于是想要?jiǎng)?chuàng)建一個(gè)新環(huán)境
1
2
3
4
5
|
conda create -n rdkit-dev conda activate rdkit-dev conda install numpy matplotlib conda install cmake cairo pillow eigen pkg-config conda install boost-cpp boost py-boost |
筆者的 Anazonda 裝在 /Users/zealseeker/opt/anaconda 中,所以該環(huán)境對應(yīng)的是:
1
|
export PYROOT= /Users/zealseeker/opt/anaconda/env/rdkit-dev |
另外注意到新建的環(huán)境用的是 python3.9,下面會(huì)用到。
然后下載源碼到一個(gè)目錄,筆者一般將所有用 git 下載的項(xiàng)目都放到 Documents/git 這個(gè)目錄下。
1
2
3
|
cd /Users/zealseeker/Documents/git git clone https: //github .com /rdkit/rdkit .git cd rdkit |
到這一步已經(jīng)可以了,但為了確保 RDKit 的安裝一切會(huì)順利,不妨先嘗試編譯一把。下面寫 3.9 就是因?yàn)槲覀冄b的是 Python 3.9。與官方介紹不同的是,由于我們只需要調(diào)試?yán)锩娴脑创a,一些可有可無的功能就不需要激活了。按道理這這樣配置編譯會(huì)順利通過(如果不并行,可能會(huì)編譯一個(gè)小時(shí)…)
1
2
3
4
5
6
7
8
|
mkdir build cd build cmake -DPYTHON_INCLUDE_DIR=$PYROOT /include/python3 .9 \ -DRDK_BUILD_AVALON_SUPPORT=OFF \ -DRDK_BUILD_CAIRO_SUPPORT=OFF \ -DRDK_BUILD_INCHI_SUPPORT=OFF \ .. make -j6 # 或著不并行,就用 make,但會(huì)慢很多 |
配置 VSCode 使其能 Debug
首先先要讓 VSCode 支持 C++ 和 CMake,需要安裝 C++ extension for VS Code 和 CMake Tools extension for VS Code 這兩個(gè)插件。裝完后需要進(jìn)行一下配置,非常關(guān)鍵:
配置 Intellisense
雖然說這個(gè)不配置問題應(yīng)該不大,但可能發(fā)現(xiàn)編輯器到處都是 problem 和波浪線,因?yàn)榫庉嬈鞑恢缿?yīng)該去哪里找頭文件,具體可參考這里。
以下是筆者的配置方法:在 .vscode 下創(chuàng)建 c_cpp_properties.json 文件,在里面添加:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
{ "configurations" : [ { "name" : "Mac" , "includePath" : [ "${workspaceFolder}/Code" , "/Users/zealseeker/opt/anaconda3/envs/rdkit-dev/include" , "/Users/zealseeker/opt/anaconda3/envs/rdkit-dev/include/python3.9" , "/Users/zealseeker/opt/anaconda3/envs/rdkit-dev/lib/python3.9/site-packages/numpy/core/include" ], "defines" : [], "macFrameworkPath" : [ "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks" ], "compilerPath" : "/usr/bin/clang" , "cStandard" : "c17" , "cppStandard" : "c++17" , "intelliSenseMode" : "macos-clang-x64" } ], "version" : 4 } |
主要配置的就是 includePath,這里需要加入 RDKit 源代碼目錄 (Code),Anaconda 的 include,Anaconda 的 Python 以及 Anaconda 的 Numpy。按理配置完后就能看到所有的錯(cuò)誤和波浪號都消失了(可以隨便打開個(gè) cpp 文件看下是否有錯(cuò)誤),如果還有錯(cuò)誤,則需要具體看是什么。(Windows 貌似會(huì)復(fù)雜點(diǎn),具體參考官方文檔。)
配置 CMake
打開 CMake Tools extension for VS Code 這個(gè)插件的配置,點(diǎn)擊設(shè)置按鈕 - 擴(kuò)展設(shè)置,就會(huì)進(jìn)入到 VSCode 的設(shè)置界面并已經(jīng)用 @ext:ms-vscode.cmake-tools 進(jìn)行篩選了。然后看到有 User 和 Workspace 兩個(gè)選擇,前者可以認(rèn)為是全局設(shè)置,后者為項(xiàng)目設(shè)置,我們選擇后者。需要修改如下幾個(gè)選項(xiàng):
- Cmake: Cmake Path
由于我們用的是 Anaconda 環(huán)境下的 CMake,尤其如果像筆者這樣通過新增環(huán)境得到的,可能 CMake 沒有被加入到 Path 環(huán)境變量。檢查的方法是在 terminal 里輸入 which cmake,如果出現(xiàn) cmake not found,則說明未加入到環(huán)境變量,需要手動(dòng)配置,筆者的 CMake 在:/Users/zealseeker/opt/anaconda3/envs/rdkit-dev/bin/cmake,所以將該路徑加入到配置中即可。而如果用的是 base 環(huán)境,則可能不需要配置,因?yàn)?CMake 已被加入到環(huán)境變量。如果發(fā)現(xiàn)該 CMake 并非之前在 Anaconda 裝的那個(gè),則仍然需要配置,否則可能會(huì)出現(xiàn)尋找錯(cuò)誤的庫的問題,詳見最后一節(jié)。
- Cmake: Configure Args
這個(gè)對應(yīng)執(zhí)行 CMake 時(shí)的參數(shù),即那些 -DXXXX=xxx 的內(nèi)容,筆者為了圖方便,僅配置了 Python
1
|
-DPYTHON_INCLUDE_DIR=/Users/zealseeker/opt/anaconda3/envs/rdkit-dev/include/python3.9 |
也可以根據(jù)需要將諸如 -DRDK_BUILD_CAIRO_SUPPORT=OFF 也加進(jìn)去,尤其是如果后續(xù)發(fā)現(xiàn)編譯時(shí)在 CAIRO 的地方出錯(cuò)了,則可以考慮禁用它。
小貼士,我們可以查看 .vscode 下是否有 settings.json 文件,并且該文件中是否有下面兩個(gè)配置以判斷是否配置成功。
1
2
3
4
5
6
|
{ "cmake.cmakePath": "/Users/zealseeker/opt/anaconda3/envs/rdkit-dev/bin/cmake", "cmake.configureArgs": [ "-DPYTHON_INCLUDE_DIR=/Users/zealseeker/opt/anaconda3/envs/rdkit-dev/include/python3.9" ] } |
- 編譯(可選)
全都配置完全,可以考慮先 Build 一下,看看有沒有問題,按一下底部狀態(tài)欄的 Build 按鈕則會(huì)自動(dòng)開始編譯(需要不少時(shí)間)。如果未能編譯完成,則需要檢查其錯(cuò)誤,看是哪里出了問題。
新建調(diào)試文件進(jìn)行調(diào)試
筆者在根目錄下創(chuàng)建了個(gè) debug 文件夾,并在里面創(chuàng)建了 test.cpp 和 CMakeLists.txt 兩個(gè)文件。test.cpp 自然是用于調(diào)試的文件,新建 main 函數(shù),傳入苯的 SMILES,將其轉(zhuǎn)化成 RWMol 對象。非常簡單的操作,僅僅是用于證明可以進(jìn)入調(diào)試狀態(tài)。
1
2
3
4
5
6
7
8
9
10
11
|
#include <GraphMol/SmilesParse/SmilesParse.h> #include <GraphMol/Depictor/RDDepictor.h> using namespace RDKit; int main( int argc , char **argv ){ std::cout << "Importing benezene" ; std::string smi = "c1ccccc1" ; RWMol *newM; newM = SmilesToMol(smi, 0, true ); return 0 } |
CMakeLists 筆者是參考了 RDKit 的例子,個(gè)人感覺不是最好,畢竟原例子并不需要我們同時(shí)編譯 RDKit 源碼和測試代碼,而是作為“已安裝 RDKit 該如何調(diào)用其 C++ 接口”的例子,但筆者能力有限,只能很僵硬地照搬。路徑基本寫死,比如 library 在 $RDBASE/build/lib 里(因?yàn)橹痪幾g未安裝,所以庫都會(huì)在 build 文件夾下)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
cmake_minimum_required( VERSION 3.5 ) project(RDKitSV) set(RDBASE "/Users/zealseeker/Documents/git/rdkit" ) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${RDBASE}/Code/cmake/Modules" ) set(CMAKE_CXX_STANDARD 14) find_package( Boost COMPONENTS iostreams filesystem system ) include_directories ( ${RDBASE}/Code) link_directories ( ${RDBASE}/build/lib ) set(RDKit_LIBS RDKitFileParsers RDKitSmilesParse RDKitDepictor RDKitRDGeometryLib RDKitRDGeneral RDKitSubstructMatch RDKitSubgraphs RDKitMolDraw2D RDKitGraphMol RDKitDistGeometry RDKitDistGeomHelpers RDKitMolAlign RDKitOptimizer RDKitForceField RDKitForceFieldHelpers RDKitAlignment RDKitForceField RDKitMolTransforms RDKitEigenSolvers ) find_package (Threads) set(RDKit_THREAD_LIBS Threads::Threads) set( LIBS ${RDKIT_LIBRARIES} Boost::iostreams ${RDKit_THREAD_LIBS} z ) include_directories(${RDKIT_INCLUDE_DIR}) add_executable( TestMol test.cpp ) target_link_libraries( TestMol ${LIBS} ${RDKit_LIBS}) |
然后在根目錄的 CMakeLists.txt 里的最后面增加一行,將 debug 文件夾加入到編譯內(nèi)容中。
1
|
add_subdirectory(debug) |
此時(shí)萬事俱備,再次點(diǎn)擊狀態(tài)欄的 Build 按鈕即可進(jìn)行最終的編譯,如果之前已經(jīng)在配置好
VSCode-Cmake 后編譯過一次,則這次會(huì)很快。編譯完后,我們就可以調(diào)試了,調(diào)試前確定調(diào)試目標(biāo)是否正確:在 Build 的右邊分別有 debug(一個(gè)蟲子)和 run(運(yùn)行按鈕),再右邊是運(yùn)行目標(biāo)(launch target),要確定其為 TestMol,如果不是,則需要點(diǎn)擊選擇并輸入 TestMol,它應(yīng)該在 $rdkit/build/debug/TestMol。
最后點(diǎn)擊小蟲子即可進(jìn)行調(diào)試,并記得加斷點(diǎn),確定可以正常調(diào)試。
Anaconda 環(huán)境問題
由于筆者電腦里有多個(gè) Anaconda 環(huán)境導(dǎo)致 CMake 在尋找?guī)斓臅r(shí)候可能會(huì)找錯(cuò)地方,因此一定要檢查 CMake 是否找對了,盡管理論上找錯(cuò)了問題也不大,但至少當(dāng)最后編譯或者運(yùn)行時(shí)報(bào)錯(cuò)時(shí)可以有據(jù)可循。
筆者在 Anaconda 的 base 環(huán)境和 rdkit-dev 環(huán)境中都有 Boost,而除了 rdkit-dev 中有 CMake 外,自己也下載了個(gè) CMake。筆者發(fā)現(xiàn)如果用自己下載的 CMake 編譯,會(huì)導(dǎo)致其尋找的是 base 環(huán)境下的 Boost (因?yàn)?VSCode 編譯時(shí)并不會(huì)激活 rdkit-dev 環(huán)境)。因此一定要使用 rdkit-dev 下的 CMake,即確保 Boost 所在 Anaconda 環(huán)境和 CMake 是同一個(gè)。
另外,筆者在編輯器中還看到下述問題,盡管其不影響編譯與調(diào)試,但說明 CMake 在尋找?guī)鞎r(shí)仍然選擇了錯(cuò)誤的地方。可惜筆者一直不知如何修復(fù),若有大神還請留言協(xié)助。該問題說明 CMake 在尋找 libcairo 時(shí)尋找的是 base 環(huán)境,而其他庫在 rdkit-dev 和 build 中,他們之間可能存在相互依賴關(guān)系。解決方法應(yīng)該是讓 libcairo 去 rdkit-dev 中找,而不是 base 環(huán)境,可并不知道如何設(shè)置這個(gè)尋找路徑優(yōu)先級。
1
2
3
4
5
6
7
8
9
10
11
|
CMake Warning at Code/cmake/Modules/RDKitUtils.cmake:49 (add_library):Cannot generate a safe runtime search path for target MolDraw2D because there is a cycle in the constraint graph: dir 0 is [/Users/zealseeker/Documents/git/rdkit/build/lib] dir 1 is [/Users/zealseeker/opt/anaconda3/envs/rdkit-dev/lib] dir 2 must precede it due to runtime library [libcairo.dylib] dir 2 is [/Users/zealseeker/opt/anaconda3/lib] dir 0 must precede it due to runtime library [libRDKitChemReactions.1.dylib] dir 1 must precede it due to runtime library [libboost_system.dylib] Some of these libraries may not be found correctly. |
參考資料
https://code.visualstudio.com/docs/cpp/cmake-linux
到此這篇關(guān)于VSCODE調(diào)試RDKit內(nèi)核的方法步驟(C++)的文章就介紹到這了,更多相關(guān)VSCODE調(diào)試RDKit內(nèi)核內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.zealseeker.com/archives/vscode-rdkit-cpp/