月度归档: 2020 年 6 月

  • Mac上PKG_CONFIG_PATH路径问题

    Mac上有homebrew可以安装常用依赖,但是安装以后pkg-config经常找不到对应的包,需要手动适配PKG_CONFIG_PATH变量。

    一般情况都会安装在/usr/local/Cellar目录下, 最直接的办法就是遍历这里的目录,找到lib/pkgconfig路径的地址,然后加入PKG_CONFIG_PATH中。

    这里可以用一个脚本来处理

    export PKG_CONFIG_PATH=$(find /usr/local/Cellar -name 'pkgconfig' -type d | grep lib/pkgconfig | tr '\n' ':' | sed s/.$//)
    …
  • 构建适用于openwrt的switch-lan-play插件

    构建适用于openwrt的switch-lan-play插件

    openwrt是一个非常实用的系统,附带的插件可以配合满足不同的需求。

    switch-lan-play是一个远程联机的工具,使用时需要一台设备转发switch的网络请求。一般来说使用的时候打开电脑就足够了,如果经常使用或者手边没有电脑,在路由器上运行明显要好很多。

    switch-lan-play官方仓库只提供了win、linux和mac的构建,openwrt的需要自己构建。

    写在前面

    本文是介绍如何构建,需要有相关技术知识储备,如果只是想直接使用,也需要有基本的相关知识储备。也可以参考下:https://www.huangyunkun.com/2021/04/14/switch-lan-play-openwrt-issue/

    构建ipk

    openwrt的ipk包除了程序本体以外一般还需要配置、启动脚本和描述信息。

    先看构建本身,来源还是git,指向switch-lan-play仓库

    https://github.com/spacemeowx2/switch-lan-play.git

    主要依赖是libpcap,版本号就跟随官方仓库,当前为0.2.3

    include $(TOPDIR)/rules.mk
    
    PKG_NAME:=switch-lan-play
    PKG_VERSION:=0.2.3
    PKG_RELEASE:=1
    
    PKG_SOURCE_PROTO:=git
    PKG_SOURCE_VERSION:=v$(PKG_VERSION)
    PKG_SOURCE_URL:=https://github.com/spacemeowx2/switch-lan-play.git
    PKG_MIRROR_HASH:=c0c663e3fdc95d6d6e8ab401caa2bfb5b5872e00
    #PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
    
    PKG_LICENSE:=GPLv3
    PKG_LICENSE_FILES:=LICENSE.TXT
    
    include $(INCLUDE_DIR)/package.mk
    include $(INCLUDE_DIR)/cmake.mk
    
    CMAKE_BINARY_SUBDIR := build-openwrt
    
    define Package/$(PKG_NAME)
    	SECTION:=net
    	CATEGORY:=Network
    	SUBMENU:=Lan-play
    	DEPENDS:=+libpcap +libpthread +libstdcpp +libatomic @!USE_UCLIBC
    	
    …
  • Rust编写Switch应用

    Rust编写Switch应用

    写Switch应用首选肯定是C/C++语言,主要依赖是devkitpro和libnx。

    如果要用Rust语言来写,最核心的就是两个问题,一个是和核心的libnx交互,一个编译产出的配置。

    Rust FFI

    由于现实中很多程序是由不同编程语言写的,必然会涉及到跨语言调用,比如 A 语言写的函数如果想在 B 语言里面调用,这时一般有两种解决方案:一种是将函数做成一个服务,通过进程间通信或网络协议通信;另一种就是直接通过 FFI 调用。前者需要至少两个独立的进程才能实现,而后者直接将其它语言的接口内嵌到本语言中,所以调用效率比前者高。

    Rust 本身定位为系统编程语言,不可避免要和现有的 C/C++ 代码交互。

    Rust FFI原理和使用文档不少,这里要解决了的主要是简便。因为手写所有绑定是不现实的。

    rust-bindgen可以帮助我们生成对应的绑定文件,支持C和部分C++。这里我们先只考虑核心的libnx。

    创建build.rs文件

    extern crate bindgen;
    
    use std::env;
    use std::path::PathBuf;
    
    pub fn main() {
        let devkitpro_path = env::var("DEVKITPRO").unwrap();
    
        println!("cargo:rustc-link-lib=static=nx");
    
        println!(
            "cargo:rustc-link-search=native={}/libnx/lib",
            devkitpro_path
        );
    
        // 
    …
  • nx-hbmenu上传Switch应用

    每次开发完应用后都需要走ftp或者usb将生成的nro文件上传到Switch,再运行应用调试查看。每次操作还是比较繁琐。

    nx-hbmenu支持网络加载,在hbmenu界面按Y键盘后,在PC端运行

    nxlink -s -a 192.168.31.66 XXX.nro

    即可。退出应用后需要再次点击Y才能重新上传。

    这里的IP是Switch的IP地址,上传速度比一般的ftp稍微慢一点。…