设计开发

VS Linux项目编译g++: fatal error: cannot specify -o with -c, -S or -E with multiple files问题

使用Visual Studio (2019)进行Linux项目开发时遇到项目编译时提示如标题所写的:

g++: fatal error: cannot specify -o with -c, -S or -E with multiple files

仔细检查了项目代码,并没有发现问题,也尝试了移除最近改动过的代码、增加过的源码文件,均不能正常编译…(同时,也确认过新建的项目可以正常编译,证明开发环境本身还是没问题的)

Continue reading…

一种通过C++模板方式识别无用户数据C回调函数的方法

今天记录一个个人觉得有点意思的问题:C++代码中调用C API时,对于C回调函数的处理问题,如何识别出调用API时的信息?

这个问题,大部分API都是通过调用时提供传递用户数据的方式实现的,如libcurl中的CURLOPT_WRITEDATA,CURLOPT_READDATA ,通过curl_easy_setopt方式将任意用户数据指针传递给CURL句柄,并在执行上传下载时的回调函数内透传给调用方,这样在例如多线程并发上传下载时就可以很方便的识别出是哪个上传下载任务的回调了。但是,如果API及回调函数内没有提供传递用户数据的接口和回调参数的话,是不是就一定无法完成识别调用上下文信息的功能呢?比如下列的C函数API:

1
2
3
4
5
6
7
8
// C-Style callback function without user context
typedef void (*c_api_callback_no_context)(int count);
// C-Style callback function with user context
typedef void (*c_api_callback_context)(int count, void * user_context);
 
// C API function that will trigger the callback function
void c_api_start_counting_no_context(c_api_callback_no_context callback, int max);
void c_api_start_counting_context(c_api_callback_context callback, int max, void * user_context);

c_api_start_counting_context及配套的c_api_callback_context回调为可以透传用户数据的版本,而c_api_start_counting_no_context及c_api_callback_no_context则只提供了逻辑用回调参数count,没有可用于识别context的用户数据指针,那么如何在不碰C源码的前提下(闭源C库或不想做侵入式修改)做到和带用户数据回调一样的效果呢?目前想到的一种方法是通过C++模板生成不同地址的回调函数配合上下文信息映射来实现:

Continue reading…

Android Studio使用override自动生成方法形参名错误问题

使用Android Studio写Java,Kotlin代码时,经常会用到Ctrl+O来实现接口的方法,今天偶然发现AS自动添加的代码变成了这样:

1
2
3
4
5
6
7
8
9
10
11
val textWatcher = object: TextWatcher {
 
    override fun afterTextChanged(p0: Editable?) {
    }
 
    override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
    }
 
    override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
    }
}

虽然不影响功能,但是看起来就很费劲了,形参名不具有自解释性了,记得之前一直是没问题的,简单查了下发现,原来是之前更新了platform sdk后,没有选择同时安装source,在SDK Manager中把当前正在用的target api版本对应的source安装上,再次执行同样操作就可以了:

Continue reading…

Android Studio带C++项目提示More than one file was found with OS independent path问题修正

近日,在将一个旧Android Studio项目(带native c/c++)升级了新版本gradle 4.0.1后(Android Studio版本4.0.1),发现重新clean再构建时,提示:

More than one file was found with OS independent path ‘lib/armeabi-v7a/xxx.so’. If you are using jniLibs and CMake IMPORTED targets, see https://developer.android.com/studio/preview/features#automatic_packaging_of_prebuilt_dependencies_used_by_cmake

虽然一开始也是一脸茫然,但既然提示信息里都提供了连接了,那就看一下吧,顺带一提,给出的链接我写这篇博文的时候并不是最终信息位置,最终链接在这里:https://developer.android.com/studio/releases/gradle-plugin#cmake-imported-targets ,仔细阅读了一下,发现实际上是从gradle 4.0开始就对jni的预编译依赖引用方式做出了修改:

Continue reading…

Android Studio的Build Output中文输出乱码(菱形问号)问题的解决方法

Win10系统(Mac上貌似没问题),Android Studio版本4.x,不知为何,Build Output中的中文,包括编译器提示、以及错误代码中的中文,都会显示为如下的乱码,菱形问号:

可以猜到javac在使用中文输出各种信息,这点可以通过使用gradle命令在单独打开的命令行中执行build则可以看到正确的中文输出来验证,因此尝试过用 “-Duser.language=en” 等改变jdk locale的方式来使编译器输出英文信息,但是这样虽然可以看到编译错误,但是本身代码里的中文还是会显示成乱码

最后终于发现了问题的根源,参考这里:

Continue reading…

JetBrains IntelliJ IDEA从2018更新到2019后无法卸载的问题

Uninstall hasn’t detected folder of XXX installation…

博主的IDEA是从2018一路升上来,最近出了2020,并且还用上了JB的Toolbox,看着Manually installed有点强迫症发作,于是尝试卸载掉后用Toolbox重新安装,结果就发现了上面写到的错误提示这个坑!

参考 https://youtrack.jetbrains.com/issue/PY-35047 可行的解决方法如下:

Continue reading…

IDEA maven unresolved dep问题的一种解决方法

最近在用IntelliJ IDEA 2020时遇到一个奇怪的问题,就是maven同步通过,但是编译时就是有依赖包找不到,提示:“maven unresolved dep XXX”,尝试过各种clean,reimport maven都无法解决问题,最后发现其实是之前某次更包时wifi断了下,导致包下错了,后面就一直陷入这种僵局了…

解决方法是,到“C:\Users\XXXX\.m2\repository”中手动删除找不到的dep包,然后再重新更新maven依赖就可以了。不是什么大问题,但错误提示信息很容易造成误导。

解决jest的”too many open files, watch”问题(Mac OSX)

在对一个有一定规模的react前端项目执行jest单元测试时,遇到了如下问题:

node scripts/test.js –env=jsdom
2020-02-04 11:05 node9117 FSEventStreamStart: register_with_server: ERROR: f2d_register_rpc() => (null) (-22)
2020-02-04 11:05 node9117 FSEventStreamStart: register_with_server: ERROR: f2d_register_rpc() => (null) (-22)
2020-02-04 11:05 node9117 FSEventStreamStart: register_with_server: ERROR: f2d_register_rpc() => (null) (-22)
events.js:174
throw er; // Unhandled ‘error’ event
^
Error: EMFILE: too many open files, watch
at FSEvent.FSWatcher._handle.onchange (internal/fs/watchers.js:123:28)
Emitted ‘error’ event at:
at FSEvent.FSWatcher._handle.onchange (internal/fs/watchers.js:129:12)
npm ERR! Test failed. See above for more details.

错误信息
Continue reading…

解决Android NDK编译FFmpeg 4.2.2的x86 cpu版时的问题

老规矩,编译环境:Win10 1903,WSL ubuntu,ndk r20b,FFmpeg 4.2.2,首先分享下编译脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/bin/bash
make clean
 
export NDK=/home/kres/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
API=21
 
function build_android
{
    echo "Compiling FFmpeg for $CPU"
    ./configure \
        --prefix=$PREFIX \
        --enable-neon \
        --enable-hwaccels \
        --enable-gpl \
        --enable-postproc \
        --enable-shared \
        --enable-jni \
        --enable-mediacodec \
        --disable-decoders \
            --enable-decoder=h264_mediacodec \
            --enable-decoder=vp9 \
            --enable-decoder=h264 \
            --enable-decoder=mpeg4 \
            --enable-decoder=aac \
            --enable-decoder=aac_latm \
            --enable-decoder=mjpeg \
            --enable-decoder=png \
            --enable-decoder=mpeg4_mediacodec \
        --disable-encoders \
            --enable-encoder=vp9_vaapi --enable-encoder=h264_nvenc --enable-encoder=h264_v4l2m2m --enable-encoder=hevc_nvenc \
        --disable-demuxers \
            --enable-demuxer=rtsp --enable-demuxer=rtp --enable-demuxer=flv --enable-demuxer=h264 \
        --disable-muxers \
            --enable-muxer=rtsp --enable-muxer=rtp --enable-muxer=flv --enable-muxer=h264 \
        --disable-parsers \
            --enable-parser=mpeg4video --enable-parser=aac --enable-parser=h264 --enable-parser=vp9 \
        --disable-protocols \
            --enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=tcp --enable-protocol=udp \
        --disable-bsfs \
        --disable-indevs --enable-indev=v4l2 \
        --disable-outdevs \
        --disable-filters \
        --disable-postproc \
        --disable-static \
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --enable-avdevice \
        --disable-doc \
        --disable-symver \
        --cross-prefix=$CROSS_PREFIX \
        --target-os=android \
        --arch=$ARCH \
        --cpu=$CPU \
        --cc=$CC \
        --cxx=$CXX \
        --enable-cross-compile \
        --sysroot=$SYSROOT \
        --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
        --extra-ldflags="$ADDI_LDFLAGS" \
        $ADDITIONAL_CONFIGURE_FLAG
 
        make clean
        make -j6
        make install
        echo "The Compilation of FFmpeg for $CPU is completed"
 
}
    #armv8-a
    ARCH=arm64
    CPU=armv8-a
    CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
    CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
    SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
    CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
    PREFIX=$(pwd)/android/$CPU
    OPTIMIZE_CFLAGS="-march=$CPU"
    build_android
 
    #armv7-a
    ARCH=arm
    CPU=armv7-a
    CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
    CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
    SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
    CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
    PREFIX=$(pwd)/android/$CPU
    OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
    build_android
 
    #x86
    ARCH=x86
    CPU=x86
    CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
    CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
    SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
    CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
    PREFIX=$(pwd)/android/$CPU
    OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
    build_android
 
    #x86_64
    ARCH=x86_64
    CPU=x86-64
    CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
    CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
    SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
    CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
    PREFIX=$(pwd)/android/$CPU
    OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
    build_android
Continue reading…

由RapidJSON发现的成员函数与宏冲突问题

在使用RapidJson的时候,发现了一个之前很少注意到的问题:

F:\Projects\test\rapidjson-1.1.0\include\rapidjson\document.h(982,70): error : too few arguments provided to function-like macro invocation
if (a < static_cast(-std::numeric_limits::max())

乍一看好像不是很眼熟的错误提示,没看懂什么意思,惯例搜索引擎查,于是很快发现了这个: https://stackoverflow.com/questions/1394132/macro-and-member-function-conflict ,简单一看就反应过来了,原来是成员函数名(这里是max)和之前不知在哪定义过的同名max冲突了,编译器把本该作为成员函数调用的max当成作了替换,于是就出现了上面的错误。

Continue reading…