使用GCC编译Notepad++的插件

server/2024/10/19 2:20:45/

Notepad++的本体1是支持使用MSVC和GCC编译的2,但是Notepad++插件的官方文档3里却只给出了MSVC的编译指南4

网上也没有找到相关的讨论,所以我尝试在 Windows 上使用 MinGW,基于 GCC-8.1.0 的 posix-sjlj 线程版本5,研究一下怎么编译:

官方例程:

https://github.com/npp-plugins/plugindemo

语法修改:

StaticDialog.cpp 文件中,找到这一行:

std::wstring errorMsg(_T(""));

可能 MSVC 和 GCC-8.1.0 存在语法不兼容,此处改为:

std::wstring errorMsg(TEXT(""));

编译命令:

编译32位:

windres -F pe-i386 NppPluginDemo.rc -o NppPluginDemo.o
windres -F pe-i386 DockingFeature/goLine.rc -o goLine.o
g++ *.o *.cpp DockingFeature/*.cpp -DUNICODE -o NppPluginDemo.dll ^-m32 -static -shared -lshlwapi

编译64位:

windres NppPluginDemo.rc -o NppPluginDemo.o
windres DockingFeature/goLine.rc -o goLine.o
g++ *.o *.cpp DockingFeature/*.cpp -DUNICODE -o NppPluginDemo.dll ^-static -shared -lshlwapi

输出为 NppPluginDemo.dll 文件。

参数说明:

windres:编译资源文件
g++:编译C++文件
-F pe-i386-m32:以32位模式编译(不添加则为64位)
-o NppPluginDemo.dll:输出为 NppPluginDemo.dll 文件
-DUNICODE:在编译源码时添加 #define UNICODE
^:bat 文件的续行符,可以将一行命令写作多行,提高可读性
-static:静态编译
-shared:编译为动态库
-lshlwapiPluginDefinition.cpp 文件中用到 PathFileExistsPathAppendPathFindFileName 这3个函数,需要添加 shlwapi6

另外,在编译时可能产生若干报错:

编译报错

如果不希望产生过多干扰信息,可以加上 -Wno-write-strings-Wno-conversion-null 减少报错,添加参数 -w 则不显示任何 warning。

至于具体怎么开发Notepad++的插件。。我以后再研究一下。。=_=

本文中引用的链接可在尾注中查找。


  1. https://github.com/notepad-plus-plus/notepad-plus-plus ↩︎

  2. https://github.com/notepad-plus-plus/notepad-plus-plus/blob/master/BUILD.md ↩︎

  3. https://npp-user-manual.org/docs/plugins/#how-to-develop-a-plugin ↩︎

  4. https://github.com/npp-plugins/plugindemo ↩︎

  5. https://sourceforge.net/projects/mingw-w64/files ↩︎

  6. https://learn.microsoft.com/zh-cn/windows/win32/api/shlwapi ↩︎


http://www.ppmy.cn/server/96533.html

相关文章

canvas-视频绘制

通过Canvas元素来实时绘制一个视频帧,并在视频帧上叠加一个图片的功能可以当作水印。 获取Canvas元素: let canvas document.getElementById(canvas) 通过getElementById函数获取页面中ID为canvas的Canvas元素,并将其存储在变量canvas中。 …

极简聊天室-websocket版(双向通信)

我们知道WebSocket是可以双向通信的,把极简聊天室代码又改了一下,前端发信息到后端也使用websocket,其实代码量更少了。。。 const express require(express); const app express(); var wsServer require(express-ws)(app)var msgs[];ap…

C#初级——字典Dictionary

字典 字典是C#中的一种集合&#xff0c;它存储键值对&#xff0c;并且每个键与一个值相关联。 创建字典 Dictionary<键的类型, 值的类型> 字典名字 new Dictionary<键的类型, 值的类型>(); Dictionary<int, string> dicStudent new Dictionary<int, str…

在Linux中,什么叫做线程

在Linux中&#xff0c;什么叫做线程&#xff1f; CPU调度的基本单位。 在Linux中&#xff0c;什么叫做进程&#xff1f; 内核视角&#xff1a; 承担分配系统资源的基本实体。 一个进程内部可以有多个执行流。 task_struct可以理解为轻量级进程。 线程是进程内部的一个分支…

PHP同城派送系统小程序源码

&#x1f69a;【同城生活新速度】同城派送系统&#xff0c;让每一刻都触手可及&#x1f680; &#x1f3d9;️ 一、即时送达&#xff0c;同城无界 你是否曾经因为急需某样物品却找不到即时送达的服务而焦急万分&#xff1f;现在&#xff0c;同城派送系统来解救你了&#xff0…

Parsing error: The keyword ‘interface‘ is reserved配置优化

当我们在创建Vue项目时,Vue默认是配置了eslint代码规范检查的,不过我们在项目中Typescript来编写代码时,却报了标题的错误,对应的代码如下: <script lang="ts"> export default{name: "DlHeader" } </script><script setup lang=&quo…

rocket 如何解决消息堆积问题、如何消息丢失问题、r安全问题(设置密码)、时间复杂度。

20240803 一、 如何解决消息堆积问题&#xff1f;一般认为单条队列消息差值>10w时 算堆积问题生产太快了线程数量的设置挤压问题 消费者消费出现问题如果堆积的消息不想要了&#xff0c;可以直接跳过堆积 二、 信息丢失问题为什么会丢失解决思路1 记录下来解决思路2 使用roc…

Thinkphp框架漏洞(附修复方法)

ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的&#xff0c;是一个快速、兼容而且简单的轻量级国产PHP开发框架&#xff0c;诞生于2006年初&#xff0c;原名FCS&#xff0c;2007年元旦正式更名为ThinkPHP&#xff0c;遵循Apache2开源协议发布&#xff0c;从Struts…