使用Visual Studio (2019)进行Linux项目开发时遇到项目编译时提示如标题所写的:
g++: fatal error: cannot specify -o with -c, -S or -E with multiple files
仔细检查了项目代码,并没有发现问题,也尝试了移除最近改动过的代码、增加过的源码文件,均不能正常编译…(同时,也确认过新建的项目可以正常编译,证明开发环境本身还是没问题的)
Continue reading…欢迎留言、转载请注明出处
使用Visual Studio (2019)进行Linux项目开发时遇到项目编译时提示如标题所写的:
g++: fatal error: cannot specify -o with -c, -S or -E with multiple files
仔细检查了项目代码,并没有发现问题,也尝试了移除最近改动过的代码、增加过的源码文件,均不能正常编译…(同时,也确认过新建的项目可以正常编译,证明开发环境本身还是没问题的)
Continue reading…今天记录一个个人觉得有点意思的问题:在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写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项目(带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…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…在对一个有一定规模的react前端项目执行jest单元测试时,遇到了如下问题:
Continue reading…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.
老规矩,编译环境: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 |
在使用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…