编译libreoffice源码-获取并编译最新的Notepad++源代码

一、简介

我们在写代码的时候,喜欢使用一些代码编辑器来编译一些重载的代码文件。 这里Notepad++比较经典,用户也很多。 Notepad++是一款非常简单、轻量且功能强大的开源软件,所以只要有一点点开源精神,想看C++11代码风格的程序员,就一定会想得到源码Notepad++的并编译它其实我这里也不例外。

基于好奇害死猫的想法,我开始了Notepad++源代码的获取和编译之旅。 一路走来,我还是遇到了很多陷阱。 在这里希望为那些对Notepad++源代码感到好奇但不知道如何获取和编译的人指出一条路。 至少我在实践中是成功的。

2. 获取Notepad++最新源码 1. 从GitHub拉取Notepad++源码

当然,还需要科学上网。

作为一名程序员,最基本的技能就是科学上网。 这里附上Notepad++官网 Notepad++官网。 在Notepad++官方网站上,您可以下载最新的Notepad++,了解最新的Notepad++相关信息。 这些与Notepad++源代码获取和编译无关。 英语好的朋友可以看看。

其中Notepad++的源码托管在Github,这里附上Notepad++的源码地址。 Notepad++的Github托管地址。 熟悉Github的朋友其实都知道怎么下载。 这里为不了解Github的朋友讲解一下如何下载源码。 当然,你需要科学上网,至少还需要vs2013的IDE环境。

编译libreoffice源码-获取并编译最新的Notepad++源代码

如上图,点击Download ZIP,下载Notepad++的源代码。

如果你想在vs2013及以上版本的IDE中直接使用Git管理工具下载,也可以点击在Visual Studio中打开,这里会手动打开本地vs,并进入团队资源管理器,如上图,第一个框填写Notepad++的git托管地址,这里可以写编译libreoffice源码,第二个是本地仓库地址,就是源码的下载地址,请根据自己的喜好来写。

2、不知道如何科学上网的朋友,请阅读这里……

不懂科学上网也没关系。 这里我于2017-3-25在CSDN上传了Github最新Notepad++的源码。 您可以于2017年3月25日点击这里下载最新的Notepad++源代码。

3.编译Notepad++

下载源码后可以看到这样的目录结构。

其中PowerEditor是Notepad++的工程文件,scintilla是Notepad++引用的强大代码编辑库。 我们编译的顺序是先编译scintilla项目,得到SciLexer.dll文件,然后编译PowerEditor项目。

1.编译scinilla项目

如何编译scintilla项目? 其实关于项目的编译,Notepad++的Github介绍主页已经说得很清楚了。 这里我选择了不使用boost库的编译方式。

Tuli已经说得很清楚了,下面是翻译成英文的关键步骤:

这里只翻译了部分内容,更详细的内容请参考附图。

2.编译PowerEditor项目

这里进入PowerEditorvisual.net目录,用vs打开图中选中的项目。

这里生成解决方案实际上存在问题。

如上图所示,这里是因为编码有点问题。 错误消息 ..srcMISCCommonmutex.cpp :错误 C2220:警告解释为错误 - 未生成“对象”文件。 经过我查资料,这个问题是可以这样解决的。 项目 -> Notepad++ 属性 -> 配置属性 -> C/C++ -> 常规,将警告设置为错误为否。

重新生成解决方案,我这里已经成功生成了。

3.问题:

编译libreoffice源码-获取并编译最新的Notepad++源代码

你完成了! ! ! 然而,显示了这样的窗口。 呃! 怎么找不到SciLexer.dll文件? 刚才折腾了这么久,SciLexer.dll文件已经编译完成,并且(如果你按照我的步骤的话)SciLexer.dll文件也被拷贝到了notepad++.exe文件的同一个目录下。 程序怎么提示找不到SciLexer.dll文件? 真的很奇怪。

这里我仔细检查了一下是不是我放错了文件,但是检查之后发现并没有放错。 那么,这很奇怪吗?

如果有问题,没关系,我们有源代码! 那就停下来跟着进去看看吧!

通过下面的代码听说了这个函数

TCHAR moduleFileName[1024];
HMODULE loadSciLexerDll()
{
    generic_string sciLexerPath = getSciLexerFullPathName(moduleFileName, 1024);
    if (not isCertificateValidated(sciLexerPath, TEXT("Notepad++")))
        return nullptr;
    return ::LoadLibrary(sciLexerPath.c_str());
}

可以看出该函数是加载SciLexer.dll文件的函数。 那么肯定是 isCertificateValidated(sciLexerPath, TEXT("Notepad++")) 返回了 FALSE,导致了错误。 那么,让我们继续吧!

root进去看到这样的功能

编译libreoffice源码-获取并编译最新的Notepad++源代码

// Get message handle and store handle from the signed file.
result = CryptQueryObject(CERT_QUERY_OBJECT_FILE,
            fullFilePath.c_str(),
            CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED,
            CERT_QUERY_FORMAT_FLAG_BINARY,
            0,
            &dwEncoding,
            &dwContentType,
            &dwFormatType,
            &hStore,
            &hMsg,
            NULL);

正是因为result的值为空,所以我们的返回失败。 很简单,只需注释掉函数 isCertificateValidated 即可。 相关代码修改如下:

TCHAR moduleFileName[1024];
HMODULE loadSciLexerDll()
{
    generic_string sciLexerPath = getSciLexerFullPathName(moduleFileName, 1024);
    // 注释了这个代码就可以跳过SciLexer.dll的文件数字签名证书检查
    // 进而成功调用SciLexer.dll
    /*if (not isCertificateValidated(sciLexerPath, TEXT("Notepad++")))
        return nullptr;*/
    return ::LoadLibrary(sciLexerPath.c_str());
}

那么问题来了,CryptQueryObject 函数到底是做什么的呢? 查询后,该函数用于验证文件的数字签名。 猜测是我们自己编译的SciLexer.dll文件的数字签名有问题。 注释函数isCertificateValidated编译libreoffice源码,继续生成解决方案,成功编译运行程序! ! !

哈哈哈! 最后,大家可以欣赏一下C++11风格、开源的Notepad++源代码! ! !

三、总结

总的来说,Notepad++的源码还是值得学习的。 其中C++11风格代码的使用以及开源库SciLexer的封装都值得学习。

打算最近清明节研究一下Notepad++的源码,增长见识,哈哈哈~~~

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 编译libreoffice源码-获取并编译最新的Notepad++源代码 https://www.wkzy.net/game/140913.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务