如何快速定位cmake执行程序位置

正常来说,cmake都是自己安装的,所以装在哪自己心里还是知道的。但是,如果cmake不是自己装的,或者是其它程序里集成的呢?比如CLion就bundle了很新版本的cmake,这时鸡贼的我在装了CLion的Mac系统上就想直接现成的cmake来build开源项目…

然后,尴尬的事就来了:我并不知道CLion自带的cmake在什么位置,找了下Library,CLion的app包内等常见位置,都没有发现自带cmake的踪影,于是搜索引擎调查了下,发现了这么个技巧:

Continue reading…

C/C++格式化字符串的一个小坑

格式化字符串是个写C/C++代码是很常见的东西,例如下面这段用了printf的简单代码:

#include <string>

int main()
{
    std::string test = "hello world!";
	printf("%s", test.c_str());
    return 0;
}

虽然看起来有点怪,混用了C++的string和C的printf输出,其实换成char *也是可以的,不过,这并不重要,重要的是我有时会偷懒把上面这段代码写成这样:

#include <string>

int main()
{
    std::string test = "hello world!";
	printf(test.c_str());
    return 0;
}

这样写,看起来似乎输出没有问题,两份代码的结果都是输出”hello world!”,并没有什么区别,那标题说的坑到底在哪呢?考虑这种情况,我们的test字符串里放的不再是简单的 hello world! 了,而是比如转义过的URL串,如“http://www.baidu.com/测试”会被转义成“http%3A%2F%2Fwww.baidu.com%2F%E6%B5%8B%E8%AF%95”,此时如果再用偷懒的写法,直接printf这个字符串,显而易见的就会出问题了!

Continue reading…

关于x265的high-tier启用问题

最近研究x265编码时如何启用high profile(后来才了解到对x265来说应该是high tier),之前接触x264的时候了解到的是直接在编码指定profile时就会有main和high的profile之分,如main、high、high10、high422等,但到了x265时却发现可指定的profile只有这么几个:

static const char * const x265_profile_names[] = {
    /* HEVC v1 */
    "main", "main10", "mainstillpicture", /* alias */ "msp",

    /* HEVC v2 (Range Extensions) */
    "main-intra", "main10-intra",
    "main444-8",  "main444-intra", "main444-stillpicture",

    "main422-10", "main422-10-intra",
    "main444-10", "main444-10-intra",

    "main12",     "main12-intra",
    "main422-12", "main422-12-intra",
    "main444-12", "main444-12-intra",

    "main444-16-intra", "main444-16-stillpicture", /* Not Supported! */
    0
};

并没有像x264的各种high,后经研究发现x265的high profile是通过另一个参数:“high-tier”来控制的,于是用ffmpeg命令行作了如下测试:

Continue reading…

[转]如何干掉一条tcp 连接(活跃/非活跃)

原文来自:https://developer.aliyun.com/article/59308,之前遇到了同样的问题,在实现RTMP服务器时由于没有设置SO_RCVTIMEO,导致在RTMP握手消息交换阶段无限等待握手数据包,出现了非活跃状态的tcp连接占用情况,试过原版tcpkill,由于非活跃状态,无法强行断开连接,所幸找到了这个修改版,试了下成功踢掉了捣乱连接,特此分享,感谢原作者!

背景

最近在测试环境部署服务的时候老是会有端口被占用情况用netstat/ss 查看后发现端口一直被占用
同另外一个ip 建立了tcp 连接,类似于这样:

ESTAB      0      0      192.168.103.169:12345              192.168.103.12:10261 

当然这个问题也不是最近才遇到,之前也遇到过,不过之前都是很快这个连接就自动消失,我就可以欢快
的使用我自己喜欢的12345 端口,无奈这次一直连续好几天这个连接一直存在导致我一直无法使用这个端口。

解决过程

1. google 找答案

google 果然告诉我答案,有个叫tcpkill 的工具(可以自行搜索一下),看到之后立即将源码下下来
编译了一把,按照提示将几个确实的包安装后编译成功,然后按照tcpkill 的帮助文档进行操作

tcpkill -i eth0 src port 12345 and dst port 10261 and src host 192.168.103.169 dst host 192.168.103.12
# 按照libpcap 规则描述出一个tcp 连接

执行上述命令后发现tcpkill 感觉像是处于hang 住状态,运行了半天也没见把这个连接干掉,为什么这个连接没干掉? 于是用 nc 测试了下,发现如下情况

对于nc 已经建立的连接运行tcpkill 后无法立即干掉,只有在这个连接上有数据传输的时候才会把发送rst 包将连接reset 掉。
Continue reading…

VS2019 16.9版引入的linux项目远程输出路径bug

这是一个Visual Studio 2019(博主发现时的版本是Community 16.9.4)的bug,之前在16.8版本的时候是没有问题的,并且影响的是VS原生的远程linux项目,Make CMake项目不受影响,发现这个问题时着实郁闷了一段时间,总结一句话就是这个选项:

红框内的两个dir,在16.9以前可以同时作用于本地windows项目路径,及同步到远端linux的项目路径,而到了16.9的时候无论怎么修改这两个路径都只有windows侧的路径会响应变化,而sync到linux的路径还会使用默认的这个路径(应该是bug或其它原因,比如,写死了?!),查了半天也没找到解决方法,对简单项目的话只好修改项目设置,都是用默认dir,或者想办法退回16.8版本,其中搜索过程中发现了有人提到这个问题:https://developercommunity.visualstudio.com/t/VS-For-Linux:-Output-files-on-remote-mac/1357691,其中提到已经修改等待发布,在此记录这个影响挺大的问题,后续有更新会同步过来…

UPDATE1: 16.10版本中已修改这个问题,加入了独立控制远端生成路径的选项。

给我13年的Mac Book Air换了个nvme硬盘

13年买的港版13寸MBA A1466一直用到21年现在,好在当时略有远见,在标配4G内存的时代选择了定制的8G内存版本,才算勉强支撑了这么多年,但当时的硬盘还是选的128G版本,用到现在已经捉襟见肘,而且随着Mac OSX系统不断更新,感觉系统、软件使用起来速度越来越慢,而且还容易发生卡顿。

其实20年初时考虑过换个10代酷睿的新版Mac Book,但选择困难症纠结配置一直纠结到了年底,结果苹果发布了ARM版的Mac CPU M1,一时间好评不断,号称各种完爆Intel版的Mac,好在当时没入10代Mac Book,但参考当年入初代锐龙时的被坑经验,决定还是先观望下M1,毕竟这个变化不小,很多软件都需要对ARM版Mac系统做出适配。

不过此时我的老MBA已经基本硬盘满到快无法使用了,看了下某宝上256G、512G的MBA原装硬盘,售价比普通m.2硬盘基本上要贵一倍,而且都是拆机二手盘,也不知道会不会有问题。幸运的是,在万能的某宝上发现了这个神器:

Continue reading…

关于typedef指针类型后的非主流const行为(misc-misplaced-const)

这是一个之前没怎么注意过的细节问题,首先,参加如下代码:

struct MyStruct
{
    int type;
    char name[40];
};

typedef MyStruct * PMyStruct;

int main(int argc, char * argv[])
{
    MyStruct my1{0}, my2{0};
    const MyStruct * pmy1 = &my1;
    pmy1 = &my2;
    const PMyStruct pmy2 = &my1;
    pmy2 = &my2;
}

很简单的一段代码,但是全引出了一个不寻常的问题:此段代码编译时,第二个pmy2结构体指针会导致编译器(gcc)报错:“error: assignment of read-only variable ‘pmy2’”,此时如果配合有clang-tidy之类的代码扫描工具,会发现pmy2声明赋值位置提示:“Clang-Tidy: ‘pmy2’ declared with a const-qualified typedef; results in the type being ‘MyStruct *const’ instead of ‘const MyStruct *’”(clang-tidy的misc-misplaced-const)!

Continue reading…

解决UE4在中文环境下Compile错误提示乱码问题

UE4 4.26.0,VS 2019 Community,中文Win10 20H2组合在一起出现了今天要讲的问题,Compile出错时的log信息中中文乱码

试过切换VS语言为英文,UE4语言为中文,均不起作用,想起之前的这个问题:Android Studio的Build Output中文输出乱码(菱形问号)问题的解决方法,以为是不是UE4也有类似的设置,查找半天无果,最后发现其实新版Win10(最早哪个版本加上的我也不清楚)里面的区域语言设置中有个UTF-8的选项,虽然到目前用的20H2时仍声称为beta状态,但确实可以解决这个问题:

Continue reading…

Unity中使用ExcelDataReader实现Excel文件读取功能的坑

首先,这次在Unity中实现读取Excel文件(.xls .xlsx)功能是通过这个开源.Net库:https://github.com/ExcelDataReader/ExcelDataReader,感谢ExcelDataReader的作者和contributors!写这篇脱坑文时的ExcelDataReader版本是3.6.0,使用的Unity版本是2019.4.12f1。可以看到,这个库的Github上Release中提供的是NuGet包和源码,当然,自行源码编译出dll使用也是可以的,或者解包nupkg,但其实在Unity中也是可以使用NuGet管理第三方库的,在Unity中通过NuGet安装ExcelDataReader的完整过程可以参考这里:https://qiita.com/tani-shi/items/b155858f07c7350d3e2d,用到的Unity NuGet插件是这个https://github.com/GlitchEnzo/NuGetForUnity/releases,同样感谢做和贡献者们!一切准备就绪后,开始码代码:

        FileStream stream = File.Open("d:\\test.xlsx", FileMode.Open, FileAccess.Read, FileShare.Read);
        IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
        Debug.Log(excelReader.IsClosed);

        DataSet result = excelReader.AsDataSet();
        int columnNum = result.Tables[0].Columns.Count;
        int rowNum = result.Tables[0].Rows.Count;

很简单的一段代码,测试下功能,在Unity Editor中运行一切正常,顺利读取出了test.xlsx中的信息,结果在Build了下Standalone执行程序后,再试,神奇的事情发生了,ExcelReaderFactory.CreateOpenXmlReader返回了null!

Continue reading…

关于clang的-Wweak-vtables警告

首先,这个weak-vtables的完整警告信息大概长这样:

warning: ‘XXX’ has no out-of-line virtual method definitions; its vtable
will be emitted in every translation unit [-Wweak-vtables]

而这个警告信息的来源一般是这样:

// XXX.h中
class BaseData
{
public:
    virtual ~BaseData() = default;
    int _base_data = 0;
};

class DerivedDataA final : public BaseData
{
public:
    int _derived_data_a = 0;
};

class DerivedDataB final : public BaseData
{
public:
    int _derived_data_b = 0;
};
Continue reading…