普通视图

发现新文章,点击刷新页面。
昨天以前首页

C++ Builder12.1试用体验

作者 missdeer
2024年7月14日 08:00

这几天突然又想试试C++ Builder,现在最新的版本是12.1。曾在大学时使用C++ Builder 6写过一些小程序,这么多年过去,源代码丢掉了一些,还能找到一些。用12.1是不能直接打开6.0的工程文件的,需要新建VCL工程,再把窗体文件、源代码文件和头文件添加进去,才能编译。12.1的VCL整体上变化不大,主要是字符串类变成了UnicodeString,以前的C++ Builder和Delphi在字符编码方面的支持确实是一大弱项,项目代码拷过来后,主要就是字符串部分需要修改一下。

6.0的时候编译器就是Borland经典C++编译器,曾经是能与微软扳手腕的存在,12.1中虽然仍然保留了这个经典编译器,但已经不推荐用了,它只能生成32位代码,而且对C++新标准的支持也没跟上,C++ Builder几经易手,后来基于Clang 5这个版本魔改实现了对VCL的支持,以及跨平台目录代码编译的支持,不但能生成Windows可执行代码,还能生成Android,Linux,iOS,macOS的可执行代码,而且Windows平台上还同时支持生成32位和64位代码,都是得益于Clang这个编译器。12.1版本在Windows平台上共有3套编译器,分别是经典32位编译器bcc32,基于Clang 5的32位编译器bcc32c/bcc32x和64位编译器bcc64,以及基于Clang 15的64位现代(modern)编译器bcc64x。

具体使用哪套编译器,要根据自己的实际需求来考虑。一般说来32位编译器生成的可执行文件比64位的文件体积小很多,但64位的程序可以使用更大的内存以及更宽的处理位宽带来的更快的运行速度。所以我觉得如果要编译32位程序,则使用基于Clang 5的编译器,如果要编译64位程序,则使用基于Clang 15的现代编译器。有个需要注意的是,64位现代编译器刚上市,有不少小问题,比如不能动态链接VCL的运行时DLL和BPL,默认会把调试符号打进exe文件导致文件体积暴增(可在链接命令行中增加-pdb nul.pdb规避),暂时不支持CMake构建,编译速度慢等等。

C++ Builder 12.1还集成了MSVS上的强力辅助插件Visual Assist X,我也是这才发现原来小番茄不知道什么时候已经被Embarcadero收购了。曾经C++ Builder 6上的自动完成非常快且可靠,自那以后慢慢就废掉了。现在集成了小番茄倒是有所改善,但还是很容易就不工作了,需要在工具菜单上选择清理VA缓存,再重启BDS,重建VA索引,才能重新工作。

总体上,写一些简单UI的Windows程序使用C++ Builder还是很方便的,可以生成体积较小的本地代码,但是这个IDE本身质量方面比较差,勉强用用还可以。真是怀念Borland时代的产品啊。

修改DNS去广告

作者 missdeer
2023年8月1日 08:00

以前也尝试过在DNS上做手脚拦截广告,但因为误杀太多以及漏网之鱼太多,觉得还不如不折腾呢。

最近偶然发现了一组列表,又尝试了一番,发现效果挺不错的,手机开屏广告绝大多数不见,浏览网页时Google Ads也基本没有了,真是让我喜出望外。所以以前效果不好的原因只是因为使用的黑名单列表不好而已。

我是在路由器上的CoreDNS使用ads插件设置拦截的,所有接入的设备都可以享受到这个效果。用到3组黑名单源,分别是Anti-adAdGuardEasyList,然后自己写了点代码将列表规整了一下,转成hosts文件的格式后合并为一个文件,ads插件可以直接通过http协议加载hosts格式的文件。CoreDNS的配置文件增加ads就行了:

1
2
3
4
5
#blocklist domains.txt
ads {
    blacklist https://cdn.jsdelivr.net/gh/missdeer/blocklist@master/convert/alldomains.txt
    nxdomain
}

武夷山之旅

作者 missdeer
2023年6月24日 08:00

端午节最终决定去武夷山游玩,对旅游这块确实既没多大兴趣,更没什么经验,都是老婆一手操办下来的。这个决定做的比较晚,导致买高铁票都是老婆花了不少日子靠在app上抢来,好在总体而言还算顺利,叫上两边的老人一起,浩浩荡荡7个人。

住宿是在一个叫一同山居的民墅,环境和服务都感觉不错,还可以提前让他们帮忙订《印象大红袍》的门票,可以讲价,当然羊毛出在羊身上,毕竟还有大头房费呢,看怎么谈更划算。高铁坐到南平市站,然后转K1线公交车到茶博园站下车。周围很多类似的民墅,和酒店的经营方式非常相似,有前台,有自己的停车场,有电梯,有自己的餐厅提供早餐,当然还有当地特色的茶厅,可以自己泡茶。价格不是很贵,估计是受疫情影响生意比以前差了,反正在这3天里我只见过另两个客人。

22号中饭是在茶人村吃的,环境挺好的,菜的口味也还好,份量也大。晚饭则是在五小厨,环境就比较一般,菜的口味还好,但份量不如茶人村那么足。两家店总的说来都是价格实惠,大概人均50元就够了,习惯了上海的馆子的价格后,这样的真算得上价廉物美了。23号中饭是在一家叫闽味私厨的馆子吃的,只有2个大妈服务员,服务差点,味道差不多,价格也差不多,结账的时候和老板聊了几句,老板说2010年-2018年就在上海开店的,后来回了老家云云。因为中饭吃得晚,晚上又要看表演,就没吃晚饭,特别跑去网上推荐的旧街小光饼,一个非常非常小的店铺,只有一个烤炉,说这炉在烤的都已经被订了,要么等50分钟出下一炉,老婆居然还犹豫,真是无法想像那些为个网红小吃等几个小时的人是怎样的脑回路,就算时间是用来浪费的,也可以浪费在更有趣的事情上啊,我直接拉她到路对面的另一个小光饼梅干菜饼店买了20块钱的饼。表演结束后回到住处,在饿了么上点夜宵,非常贵,就是专砍游客的,非常不推荐,应该去店里吃的。

比较恼火的是天气不好,一直在下午,22号吃过中饭,下午冒着大雨去了一下大红袍景点,看到了传说中的几株母树。23号本来想去天游峰的,但是因为我妈身体不好,我和我爸只好爬到1/3的路程返回,我老婆和丈人丈母娘带着我儿子居然爬上去了,结果因为我妈爬不了山,到哪都是要爬山的,跑去水帘洞,走了不少路,发现最后也是要爬山的,只能原路返回,直到我老婆他们下山。

这一趟最值的是晚上看《印象大红袍》表演了,天公作美,表演期间没有下雨,这种表演形式也新奇,感觉是这次到武夷山旅游最值得的一个项目了。非常推荐!

最想吐槽的是交通状况,那边红绿灯非常少,斑马线也非常少,要横穿马路就是裸奔,全靠司机素质好,遇到行人肯停车等待。另一个是高德地图的实时公交功能不能用,对于在上海用惯这功能的人来说,简直变成了瞎子。24号赶高铁,在公交站等了十几分钟没等到K1线,老婆就着急忙慌打了个车先走了,结果不到2分钟后我刚在高德地图下了单,K1线就过来了,上了车就接到接单出租车司机的电话,连忙取消订单。这个体验太差了。

Windows上cmake适配多种构建工具和编译器

作者 missdeer
2022年1月10日 08:00

用CMake的好处一是屏蔽了多种常见编译器的编译选项和命令行参数差异,二是可以选择目标构建工具。我前段时间要写一个SDK,希望SDK能在主流操作系统(Windows,Linux,macOS)上跑,能用常见的编译器套件(MSVC,GCC,Clang,Intel C编译器等等)编译,这正好是CMake的用武之地。

使用不同的构建工具

NMake

以Windows为例,我想用MSVC编译,则用如下命令行:

1
2
3
4
mkdir build
cd build
cmake.exe -DCMAKE_BUILD_TYPE=Release -G"NMake Makefiles" -DCMAKE_PREFIX_PATH=U:\boost_1_77_0  ..
nmake

JOM

如果嫌nmake编译速度慢,Qt提供了一个跟nmake相近但允许像GNU make一样加-j参数并行编译的工具JOM,命令行如下:

1
2
3
4
mkdir build
cd build
cmake.exe -DCMAKE_BUILD_TYPE=Release -G"NMake Makefiles JOM" -DCMAKE_PREFIX_PATH=U:\boost_1_77_0 -DCMAKE_MAKE_PROGRAM=C:\Qt\Tools\QtCreator\bin\jom\jom.exe  ..
jom.exe -j 12

Ninja

也可以用现在很流行的另一个构建工具Ninja,它默认自动进行并行编译,命令行如下:

1
2
3
4
mkdir build
cd build
cmake.exe -DCMAKE_BUILD_TYPE=Release -G"Ninja" -DCMAKE_PREFIX_PATH=U:\boost_1_77_0 -DCMAKE_MAKE_PROGRAM=C:\Tools\ninja.exe  ..
ninja.exe

使用不同的编译器

Clang for Windows

前面是用了MSVC,如果想用Clang,Clang在Windows上有2种,一种是使用MSVC的套件,前端命令工具是clang-cl,另一种是使用MinGW,前端命令工具是clang,在cmake中只要参数设置一下就可以了:

1
2
3
4
mkdir build
cd build
cmake.exe -DCMAKE_BUILD_TYPE=Release -G"NMake Makefiles" -DCMAKE_PREFIX_PATH=U:\boost_1_77_0  -DCMAKE_CXX_COMPILER=clang-cl  ..
nmake

Intel oneAPI Compiler

以前Intel C编译器只在Linux上是免费的,现在Windows和macOS上也有免费安装包下载了,有在线安装和离线安装包2种,根据自己网络情况下载后安装,然后从开始菜单找到Intel oneAPI command prompt for Intel 64 for Visual Studio 2019,它的工具命令行是icx,但后面接了clang,所以也是clang-cl,这点不需要关心,知道是这回事就行,命令行如下:

1
2
3
4
mkdir build
cd build
cmake.exe -DCMAKE_BUILD_TYPE=Release -G"NMake Makefiles" -DCMAKE_PREFIX_PATH=U:\boost_1_77_0  -DCMAKE_CXX_COMPILER=icx  ..
nmake

用Intel oneAPI编译出来的可执行文件相比MSVC和官方Clang编译出来的可执行文件多链接了一个libmmd.dll,可能这是Intel家特有的一个优化点。

GCC/Clang with MinGW

MinGW在Windows上有多套环境,不同环境又有GCC和Clang这2种C++编译器,CMake都支持了这总共4种编译套件,构建工具可以使用MinGW官方的mingw32-make,注意一定要用官方CMake包,不要用msys2中的CMake,会有奇怪的问题。

64位GCC

1
2
3
4
mkdir mingw64-gcc-build
cd mingw64-gcc-build
env PATH=$PATH:/mingw64/bin cmake.exe -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=gcc -DCMAKE_MAKE_PROGRAM=/mingw64/bin/mingw32-make.exe ..
env PATH=$PATH:/mingw64/bin /mingw64/bin/mingw32-make.exe -j `nproc` 

64位Clang

1
2
3
4
mkdir mingw64-clang-build
cd mingw64-clang-build
env PATH=$PATH:/clang64/bin cmake.exe -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang -DCMAKE_MAKE_PROGRAM=/clang64/bin/mingw32-make.exe ..
env PATH=$PATH:/clang64/bin /clang64/bin/mingw32-make.exe -j `nproc` 

32位GCC

1
2
3
4
mkdir mingw32-gcc-build
cd mingw32-gcc-build
env PATH=$PATH:/mingw32/bin cmake.exe -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=gcc -DCMAKE_MAKE_PROGRAM=/mingw32/bin/mingw32-make.exe ..
env PATH=$PATH:/mingw32/bin /mingw32/bin/mingw32-make.exe -j `nproc` 

32位Clang

1
2
3
4
mkdir mingw32-clang-build
cd mingw32-clang-build
env PATH=$PATH:/clang32/bin cmake.exe -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang -DCMAKE_MAKE_PROGRAM=/clang32/bin/mingw32-make.exe ..
env PATH=$PATH:/clang32/bin /clang32/bin/mingw32-make.exe -j `nproc` 

使用cmake构建Qt5程序的一些坑

作者 missdeer
2021年7月20日 08:00

突然想试一下CLion上写Qt5程序是什么体验,反正有JB家的全家桶License。CLion使用cmake作为构建工具,而Qt官方也开始支持cmake,但使用过程中还是遇到一些坑,记录一下。

读Qt的cmake使用帮助

这点很重要,一些最重要的问题在使用帮助中已经提到了,一定要逐字逐句读一遍。

设置Qt路径

这个在网上随便搜一下就能找到很多文章都提到了,就是设置到CMAKE_PREFIX_PATHQt5_DIR中,注意设置到系统环境变量中与作为命令行参数传给cmake效果是有区别的,我发现作为命令行参数传递比较省事。

编译可执行文件或动态库

如果编译的项目是个exe或动态库,需要将Qt模块添加到目标链接库列表中,这样cmake就会自动把Qt的头文件路径和库文件路径添加到编译器的搜索路径列表中:

1
target_link_libraries(MyProgram Qt::Widgets Qt::Network Qt::Xml)

编译静态库

如果要编译的项目是个静态库,没法用target_link_libraries,但光是设置CMAKE_PREFIX_PATH仍然会在编译过程中报错找不到Qt的头文件,需要自己加入头文件搜索路径:

1
2
3
4
5
include_directories(
        ${Qt5Widgets_INCLUDE_DIRS}
        ${Qt5Network_INCLUDE_DIRS}
        ${Qt5Xml_INCLUDE_DIRS}
        )

其中Qt5Widgets_INCLUDE_DIRS一项就包含了WidgetsCoreGui三个模块。

编译Qt plugin项目

如果要编译的项目是以QtPlugin形式写成的库,要自己定义一个宏QT_STATICPLUGIN,这样写就可以:

1
add_compile_definitions(QT_STATICPLUGIN=1)

生成mac bundle

macOS上的bundle要多打包图标等一些资源,稍微麻烦一点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (APPLE)
    set(MACOSX_BUNDLE true)
    set(MACOSX_BUNDLE_BUNDLE_NAME MyProgram)
    set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.ismisv.myprogram")
    set(MACOSX_BUNDLE_ICON_FILE "MyProgram.icns")
    set(MACOSX_BUNDLE_INFO_STRING "MyProgram")
    set(MACOSX_BUNDLE_LONG_VERSION_STRING "1.0.0.1")
    set(MACOSX_BUNDLE_SHORT_VERSION_STRING "1.0")
    set(MACOSX_BUNDLE_BUNDLE_VERSION "1.0")

    set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/MyProgram.icns" PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
    set_target_properties(
            MyProgram
            PROPERTIES
            RESOURCE "./MyProgram.icns"
            WIN32_EXECUTABLE TRUE
            MACOSX_BUNDLE TRUE
    )
endif()

指定当前项目使用的编程语言

Cmake可以指定当前项目使用的编程语言,比如:

1
project(MyProgram LANGUAGES CXX)

这样cmake只会编译.cpp.cxx这些C++编译器认的文件,如果项目中有一些.c文件,则会被忽略,所以干脆不写就能编译所有类型的文件:

1
project(MyProgram)

买了个GL.iNet MT1300

作者 missdeer
2021年1月1日 08:00

前些天脑袋一热,就在淘宝花了400大洋入了一个GL.iNet MT1300,主要是换了工作后单位里只是普通电信宽带,上Google搜索是我刚需,尝试了在Windows上用tun2socks和在Virtualbox里装Linux做旁路由后,最后还是决定需要一个额外的小设备专门做这种事情。

隔三差五在淘宝乱翻,偶然看到这款小路由器,虽然十多年前就听说过OpenWRT有很高的可定制性,但我这些年都是在自己找机器刷通用Linux发行版做路由器或旁路由的,早几年OpenWRT上编译个Go程序都没官方支持让我对其观感更不好了。这次下单前特地去搜了一下Go编译器支持,没了后顾之忧,又由于其可以插USB上网卡,又可以无线中继,这些特点正是我非常看重的。

虽然是第一次把玩OpenWRT机器,不过总体说来这款机器还是比较容易上手的。就我的目标而言是为了能随时接入一个宽带或4G网络就可以得到一个全局科学上网的环境,所以要做的事就很明确了。

首先解决DNS的问题,先上web管理界面看了一下,是有自定义DNS服务器的功能的,其中最方便的是直接选用Cloudflare或NextDNS的DNS over TLS,如下图:

Custom DNS server

果然所有DNS解析请求都走Cloudflare了,当然不满足于此。然后通过ssh登录进系统看了一下,发现了经典的dnsmasq监听在53端口,以及有点名气的stubby监听在53535端口,看一下dnsmasq的配置文件,果然有一句server=127.0.0.1#53535。这就很好解决了,发现还有一行配置是conf-dir=/tmp/dnsmasq.d/,就直接把肥猫大佬维护的几个配置文件下载到该目录,再重启dnsmasq就可以了。

然后是解决传输问题。鉴于这个机器的配置确实比较低,无论内存,CPU还是存储都比较差,所以不用多考虑就选择了ss-libev,在Plugin界面更新一下后直接安装Luci和ss-libev,如果有其他缺的包,在安装或使用过程中会再提示,很方便。安装完成后配置一下,先设置一下Remote Servers,再设置Local Instances时可以选择刚设置的Remote Servers,而且很方便的一点是安装某个包的时候已经加了几个不同种类的Local Instances,修改一下就完事了。我是先设置一个ss-local,然后在ssh里用curl测试一下线路是否正常,再设置一个ss-redir,最后是设置Redir Rules,可能也会提示要安装什么包,装上后看一遍各个设置字段下方的提示,我就设置了一下Dst ip/net bypass fileDst default,其中Dst ip/net bypass file也是从网上下载由ipip.net维护的中国大陆地区IP列表,填入下载后保存的路径即可,而Dst default则改为forward,如下图所示:

Redir Rules

这样之后,所有接入该机器的设备应该都能自动享受到科学上网的环境了。

❌
❌