您好,登錄后才能下訂單哦!
這篇文章主要講解了“notepad插件cmake的編譯過程是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“notepad插件cmake的編譯過程是什么”吧!
Notepad++ 是一個文本編輯器小軟件,用來替代windows自帶的記事本。然而Notepad++軟件的作者太霸道,如果你不贊同他的觀點,Notepad++將會在你的源碼里面插入隨機字符。推薦一款國產的開源跨平臺軟件NDD(notepad--),功能一點兒不弱,體積小巧打開速度快,且帶有文件夾比對功能,連收費的beyondCompare都省了。且可以為它貢獻插件啦,添加一些有意思的功能,比如我想給它添加個ChatGPT聊天機器人插件。期待更多優秀的國產軟件,為國產化崛起貢獻力量。
Notepad–是一個使用C++編寫的文本編輯器,目前支持Win/Linux/Mac平臺。在gitee上的項目名稱為NDD。gitee倉庫地址:
https://gitee.com/cxasm/notepad--
目標是要進行文本編輯類軟件的國產可替代,重點在國產Uos/Linux系統、Mac 系統上發展。
一個支持windows/linux/mac的文本編輯器,目標是要國產替換同類軟件,來自中國。對比其它競品Notepad類軟件而言,優勢是可以跨平臺,支持linux mac操作系統。
可直接下載使用,發布版的軟件下載地址:
https://gitee.com/cxasm/notepad--/releases/tag/v1.21
Microsoft C++ Build Tools,通過可編寫腳本的獨立安裝程序提供 MSVC 工具集,無需使用 Visual Studio。 如果從命令行界面(例如,持續集成工作流中)生成面向 Windows 的 C++ 庫和應用程序, 推薦使用此工具。
為什么使用msvc工具?因為Visual Studio太大啦,好幾個G,且我已安裝過一個版本了,不想再安裝一個新版本了。編譯NDD源碼的需注意,QT框架需要5.11以上。c++編譯器至少需要支持c++17以上才行。直接下載msvc工具鏈1G左右大小,且下載速度超快。
msvc工具鏈下載地址:
Microsoft C++ Build Tools - Visual Studio
安裝這個需要注意的是,一定要勾選用于Windows的c++ Cmake工具這一項。
雖然NDD發布版提供了現成的軟件可以用,但是對于開發來說,開發的插件必須使用同一套的MSVC和QT版本才行(VS2019和QT5.15.2),否則容易出現兼容性問題,對于開發測試插件來說,直接連ndd源碼也一塊兒編譯,最簡單直接。且最終想要貢獻插件時也不用擔心,作者鼓勵大家定做插件,熱門插件會給你合并進發布版中。
源碼編譯比較簡單,作者提供的有編譯文檔介紹,windows下推薦編譯環境:vs2017及以上,qt tool 插件。這里介紹下使用cmake編譯,也很簡單,在源碼的how_build目錄里有CMakeLists.txt文件,拷貝到項目根目錄中,設置好cmake環境,就可以直接編譯了。
cmake_minimum_required(VERSION 3.16) project(NotePad-- VERSION 1.22.0) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) add_definitions( -DCMAKE_CXX_STANDARD=17 ) set(CMAKE_PREFIX_PATH "D:/Qt5.12.11/Qt5.12.11/5.12.11/msvc2015_64/lib/cmake") find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets Concurrent Network PrintSupport XmlPatterns) # qscint 關鍵依賴庫 add_subdirectory(${PROJECT_SOURCE_DIR}/src/qscint) # 插件庫包含 # helloworld 動態插件庫 add_subdirectory(${PROJECT_SOURCE_DIR}/src/plugin/helloworld) # win下需要開啟UNICODE進行支持TCHAR if(CMAKE_HOST_WIN32) add_definitions(-D_UNICODE -DUNICODE) endif() if(${PLUGIN_EN}) if(${PLUGIN_EN} STREQUAL on) add_definitions(-DNO_PLUGIN=1) endif(${PLUGIN_EN}) endif() file(GLOB UI_SRC ${PROJECT_SOURCE_DIR}/src/*.ui) set(UI_SRC ${UI_SRC} ${PROJECT_SOURCE_DIR}/src/cceditor/ccnotepad.ui) aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC) aux_source_directory(${PROJECT_SOURCE_DIR}/src/cceditor SRC) if(CMAKE_HOST_WIN32) # 添加 WIN32 保證主程序啟動沒有命令行 list(APPEND WIN_RCS ${PROJECT_SOURCE_DIR}/src/RealCompareToMinGw.rc) add_executable(${PROJECT_NAME} WIN32 ${WIN_RCS} ${SRC} ${UI_SRC} ${PROJECT_SOURCE_DIR}/src/RealCompare.qrc) else() add_executable(${PROJECT_NAME} ${SRC} ${UI_SRC} ${PROJECT_SOURCE_DIR}/src/RealCompare.qrc) endif() target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/src/cceditor ${PROJECT_SOURCE_DIR}/src/qscint/src ${PROJECT_SOURCE_DIR}/src/qscint/src/Qsci ${PROJECT_SOURCE_DIR}/src/qscint/scintilla/src ${PROJECT_SOURCE_DIR}/src/qscint/scintilla/include ${PROJECT_SOURCE_DIR}/src/qscint/scintilla/lexlib ${PROJECT_SOURCE_DIR}/src/qscint/scintilla/boostregex ) target_link_libraries(${PROJECT_NAME} qscint Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Concurrent Qt5::Network Qt5::PrintSupport Qt5::XmlPatterns) # set(PROJECT_BINARY_DIR "${PROJECT_BINARY_DIR}/bin") # set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) if(CMAKE_HOST_UNIX) install( TARGETS ${PROJECT_NAME} DESTINATION "bin" ) install(DIRECTORY ${PROJECT_SOURCE_DIR}/src/linux/usr DESTINATION "/") include(${PROJECT_SOURCE_DIR}/cmake/deb_package_config.cmake) include(CPack) elseif(CMAKE_HOST_WIN32) install(TARGETS ${PROJECT_NAME} DESTINATION "/") install(DIRECTORY ${PROJECT_SOURCE_DIR}/build/bin/ DESTINATION "/") # 設置軟件版本 set(CPACK_PACKAGE_NAME "NotePad--") set(CPACK_PACKAGE_DESCRIPTION "NotePad--") set(CPACK_PACKAGE_COPYRIGHT "Copyright (c) 2023") set(CPACK_PACKAGE_VERSION "1.22.0") set(CPACK_PACKAGE_VERSION_MAJOR "1") set(CPACK_PACKAGE_VERSION_MINOR "22") set(CPACK_PACKAGE_VERSION_PATCH "0") #include(${PROJECT_SOURCE_DIR}/cmake/nsis_package_config.cmake) include(CPack) endif()
源碼編譯注意事項:
# qscint 關鍵依賴庫 add_subdirectory(${PROJECT_SOURCE_DIR}/src/qscint) ...... target_link_libraries(${PROJECT_NAME} qscint Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Concurrent Qt5::Network Qt5::PrintSupport Qt5::XmlPatterns)
從以上可看出,源碼里附帶的那個how_build文件夾,拷貝出的默認的CmakeLists.txt文件,是包含了 qscint 關鍵依賴庫,且默認里面是把qscint生成的靜態的。感覺這樣有點別扭。因為最終是想把qscint庫動態使用的。
因此這里編譯NDD源碼,注釋掉了這個,先單獨編譯qscint為動態庫。有個注意事項,編譯qscint動態庫,需增加宏定義add_definitions(-DQSCINTILLA_MAKE_DLL),既讓Q_DECL_EXPORT生效。這個會讓動態庫同時生成dll和lib文件。
然后修改NDD主程序的CmakeLists.txt文件,引入和使用上一步生成的qscint庫。
本以為很順利,結果編譯報錯啦。
解決辦法:
再編譯NDD源碼時,改下庫的使用方式。在 windows 中構建此庫時應該采用 O DECL EXPORT, 并且在 windows 中使用此庫時應該采用 Q DECL IMPORT。
插件的制作和編譯,作者提供的有插件編程開發說明文檔。這里介紹下cmake的編譯方法,相對更簡單些。插件需要依賴qscintila庫,先編譯出qscintila庫。源碼notepad--\src\qscint文件夾,CmakeLists.txt文件幾乎不用咋改動,即可成功編譯。需要注意的是:
set(CMAKE_PREFIX_PATH "D:/Qt5.12.11/Qt5.12.11/5.12.11/msvc2015_64/lib/cmake") add_definitions(-DBOOST_REGEX_STANDALONE)
增加-DBOOST_REGEX_STANDALONE這個宏定義,否則還需要依賴Boost庫。加上這個可獨立編譯成功啦。 需要注意的是,cmakeLists.txt 中增加以下配置,支持debug和其他模式下找到對應的庫。
link_directories( ${CMAKE_CURRENT_SOURCE_DIR}/ ) target_link_libraries(${PROJECT_NAME} PRIVATE debug qmyedit_qt5d optimized qmyedit_qt5)
另外還需注意的是,如果是要把 qscintila庫動態的使用,則需要定義宏:
add_definitions(-DQSCINTILLA_MAKE_DLL)
這個是#define QSCINTILLA_EXPORT Q_DECL_EXPORT,Q_DECL_EXPORT宏主要為了導出這個類,生成.dll的同時生成.lib文件(注意這里的lib文件不是靜態庫,而是供外部鏈接使用的)提供給外部接口供其他類使用。
cmake_minimum_required(VERSION 3.16) project(qscint CXX) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(CMAKE_PREFIX_PATH "D:/Qt5.12.11/Qt5.12.11/5.12.11/msvc2015_64/lib/cmake") add_definitions(-DBOOST_REGEX_STANDALONE) find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets Concurrent Network PrintSupport) aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC) aux_source_directory(${PROJECT_SOURCE_DIR}/scintilla/lexers SRC) aux_source_directory(${PROJECT_SOURCE_DIR}/scintilla/lexlib SRC) aux_source_directory(${PROJECT_SOURCE_DIR}/scintilla/src SRC) aux_source_directory(${PROJECT_SOURCE_DIR}/scintilla/boostregex SRC) file(GLOB MOC_HEADER ${PROJECT_SOURCE_DIR}/src/Qsci/*.h) #message(${MOC_HEADER}) add_library(${PROJECT_NAME} STATIC ${SRC} ${MOC_HEADER}) # add_definitions(-DQSCINTILLA_MAKE_DLL) # add_library(${PROJECT_NAME} SHARED ${SRC} ${MOC_HEADER}) target_compile_definitions(${PROJECT_NAME} PRIVATE SCINTILLA_QT SCI_LEXER INCLUDE_DEPRECATED_FEATURES) target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/scintilla/lexlib ${PROJECT_SOURCE_DIR}/scintilla/boostregex ) target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/src/Qsci ${PROJECT_SOURCE_DIR}/scintilla/src ${PROJECT_SOURCE_DIR}/scintilla/include) target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Concurrent Qt5::Network Qt5::PrintSupport) if("${CMAKE_BUILD_TYPE}" STREQUAL "Release") set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "qmyedit_qt5") else() set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "qmyedit_qt5d") endif()
#include <qobject.h> #include <qstring.h> #include <pluginGl.h> #include <functional> #include <qsciscintilla.h> #include "qttestclass.h" #include "NDDMyPlugin.h" #define NDD_EXPORTDLL #if defined(Q_OS_WIN) #if defined(NDD_EXPORTDLL) #define NDD_EXPORT __declspec(dllexport) #else #define NDD_EXPORT __declspec(dllimport) #endif #else #define NDD_EXPORT __attribute__((visibility("default"))) #endif #ifdef __cplusplus extern "C" { #endif NDD_EXPORT bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData); NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::function<QsciScintilla* ()>getCurEdit, NDD_PROC_DATA* procData); #ifdef __cplusplus } #endif NDDMyPlugin *nddMyPlugin = nullptr; static NDD_PROC_DATA s_procData; static QWidget* s_pMainNotepad = nullptr; std::function<QsciScintilla* ()> s_getCurEdit; bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData) { if(pProcData == NULL) { return false; } pProcData->m_strPlugName = QObject::tr("Hello World Plug"); pProcData->m_strComment = QObject::tr("char to Upper."); pProcData->m_version = QString("v1.0"); pProcData->m_auther = QString("yangqq.xyz"); pProcData->m_menuType = 1; return true; } //則點擊菜單欄按鈕時,會自動調用到該插件的入口點函數。 //pNotepad:就是CCNotepad的主界面指針 //strFileName:當前插件DLL的全路徑,如果不關心,則可以不使用 //getCurEdit:從NDD主程序傳遞過來的仿函數,通過該函數獲取當前編輯框操作對象QsciScintilla //pProcData:如果pProcData->m_menuType = 0 ,則該指針為空;如果pProcData->m_menuType = 1,則該指針有值。目前需要關心s_procData.m_rootMenu //開發者可以在該菜單下面,自行創建二級菜單 int NDD_PROC_MAIN(QWidget* pNotepad, const QString &strFileName, std::function<QsciScintilla*()>getCurEdit, NDD_PROC_DATA* pProcData) { QsciScintilla* pEdit = getCurEdit(); if (pEdit == nullptr) { return -1; } //務必拷貝一份pProcData,在外面會釋放。 if (pProcData != nullptr) { s_procData = *pProcData; } s_pMainNotepad = pNotepad; s_getCurEdit = getCurEdit; //如果pProcData->m_menuType = 1;是自己要創建二級菜單的場景。則通過s_procData.m_rootMenu 獲取該插件的菜單根節點。 //插件開發者自行在s_procData.m_rootMenu下添加新的二級菜單項目 //QMenu* menu = s_procData.m_rootMenu; if (!nddMyPlugin) { nddMyPlugin = new NDDMyPlugin(s_pMainNotepad, strFileName, nullptr, s_pMainNotepad); nddMyPlugin->getViewMenu(s_procData.m_rootMenu); nddMyPlugin->setScintilla(s_getCurEdit); } return 0; }
cmake_minimum_required(VERSION 3.16) project(helloworld) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(CMAKE_PREFIX_PATH "D:/Qt5.12.11/Qt5.12.11/5.12.11/msvc2015_64/lib/cmake") find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets Concurrent Network PrintSupport XmlPatterns) add_definitions(-D_UNICODE -DUNICODE) file(GLOB UI_SRC ${PROJECT_SOURCE_DIR}/*.ui) file(GLOB SRC ${PROJECT_SOURCE_DIR}/*.cpp) file(GLOB MOC_HEADER ${PROJECT_SOURCE_DIR}/*.h) # add_executable(${PROJECT_NAME} ${IS_WIN} ${SRC} ${UI_SRC} ${PROJECT_SOURCE_DIR}/src/RealCompare.qrc) #link_directories( # ${CMAKE_CURRENT_SOURCE_DIR}/ #) find_library(QSCINT_LIB qmyedit_qt5 PATH ${CMAKE_CURRENT_SOURCE_DIR}/) add_library(${PROJECT_NAME} SHARED ${SRC} ${UI_SRC} ${MOC_HEADER}) target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/../../include ${PROJECT_SOURCE_DIR}/../../qscint/src ${PROJECT_SOURCE_DIR}/../../qscint/src/Qsci ${PROJECT_SOURCE_DIR}/../../qscint/scintilla/src ${PROJECT_SOURCE_DIR}/../../qscint/scintilla/include ${PROJECT_SOURCE_DIR}/../../qscint/scintilla/lexlib ${PROJECT_SOURCE_DIR}/../../qscint/scintilla/boostregex ) #set(QS_CINT_LIB ${CMAKE_CURRENT_SOURCE_DIR}/qmyedit_qt5.lib) #target_link_libraries(${PROJECT_NAME} PRIVATE # debug qmyedit_qt5_d # optimized qmyedit_qt5) target_link_libraries(${PROJECT_NAME} PRIVATE ${QSCINT_LIB} Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Concurrent Qt5::Network Qt5::PrintSupport Qt5::XmlPatterns)
感謝各位的閱讀,以上就是“notepad插件cmake的編譯過程是什么”的內容了,經過本文的學習后,相信大家對notepad插件cmake的編譯過程是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。