我想创建一个自定义命令,libtool在构建期间使用 Apple 的命令将所有静态库合并到一个胖静态库中。我正在使用 Xcode 生成器和 CMake 3.19.1。我的脚本是这样的:
set( TARGET_OUTPUT_NAME ${CMAKE_BINARY_DIR}/fat-libs/${CMAKE_CFG_INTDIR}/lib${libname}.a )
add_custom_command(
OUTPUT
${TARGET_OUTPUT_NAME}
COMMAND
/usr/bin/libtool -static -o ${TARGET_OUTPUT_NAME} $<TARGET_FILE:${libname}>
$<$<CONFIG:Debug>:${all_dependencies_debug}>
$<$<CONFIG:Release>:${all_dependencies_release}>
DEPENDS
${libname}
COMMENT
"Building merged static library"
)
add_custom_target( ${TARGET_NAME} DEPENDS ${TARGET_OUTPUT_NAME} )
Run Code Online (Sandbox Code Playgroud)
libname是目标的名称,其调试和发布的依赖项被收集到all_dependencies_debug和all_dependencies_release列表中并应合并。这些列表的内容可能包含静态库或生成器表达式的实际路径(如果依赖项是另一个目标,无论是真实的还是导入的)。
但是,这会在 Xcode 中生成以下脚本:
set( TARGET_OUTPUT_NAME ${CMAKE_BINARY_DIR}/fat-libs/${CMAKE_CFG_INTDIR}/lib${libname}.a )
add_custom_command(
OUTPUT
${TARGET_OUTPUT_NAME}
COMMAND
/usr/bin/libtool -static -o ${TARGET_OUTPUT_NAME} $<TARGET_FILE:${libname}>
$<$<CONFIG:Debug>:${all_dependencies_debug}>
$<$<CONFIG:Release>:${all_dependencies_release}>
DEPENDS
${libname}
COMMENT
"Building merged static library"
)
add_custom_target( ${TARGET_NAME} DEPENDS ${TARGET_OUTPUT_NAME} )
Run Code Online (Sandbox Code Playgroud)
当然,这在构建过程中会失败,因为 xcodesyntax error在解析$<1: …
我们是一群开发人员正在开发用于Android的实时视频处理应用程序.最近,一位客户报告我们的应用程序冻结仅在Nexus 10设备上发生.我们自己购买了设备并进行了测试:
有关冻结的更多信息:
我们的应用程序在onResume活动方法中打开相机,安装预览回调,为我们的处理需求设置最佳预览尺寸(在nexus 10这是1920x1080)并开始预览(如果从睡眠中恢复)或委托相同到SurfaceView的SurfaceView回调方法.在onPause方法中,我们的应用程序会删除预览回调,停止相机预览并释放相机.但是,我们的调查表明,该camera.release方法有时需要30秒才能完成.在那30秒内,我们的应用程序被冻结,因为我们曾经从UI线程控制相机.后来我们将相机控件移动到单独的事件处理程序线程,现在camera.release挂起该线程.虽然现在对用户来说这是不可见的(UI未被阻止),但是在我们的后台线程成功释放相机(即camera.release被叫后30秒)之前,用户无法使用任何应用程序中的相机.
在挂起期间,我们观察到来自摄像头服务的以下日志输出:
10-21 16:08:54.193: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight
10-21 16:08:54.193: E/Camera2Client(122): stopPreviewL: Camera 0: Waiting to stop streaming failed: Connection timed out (-110)
10-21 16:09:04.293: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight
10-21 16:09:04.293: E/Camera2Client(122): stopPreviewL: Camera 0: Waiting to stop streaming failed: Connection timed out …Run Code Online (Sandbox Code Playgroud) 我在Android 5.x Camera2 API中发现了内存泄漏,我也报告过.问题是当您使用在LEGACY模式下实现Camera2 API的Android Lollipop设备时.在这样的设备上,调用context.getSystemService(Context.CAMERA_SERVICE)原因context以便不会被垃圾收集.
如果这context是您多次启动的活动,则最终可能会挂起对活动的数十个实例的挂起引用,这些实例从不被垃圾回收.
问题似乎只发生在LEGACY模式下实现Camera2 API的Lollipop设备上(例如HTC One M8,三星Galaxy S4),而在FULL模式下实现Camera2 API的三星Galaxy S6上则不会发生.
为了演示这个问题,我创建了一个小型演示应用程序.该应用程序包含两个活动:首先包含一个调用第二个活动的按钮.第二个活动获取CameraManager并查询第一个后置摄像头的Camera2 API支持级别,并将结果返回给第一个活动.如果您在LEGACY模式下实现Camera2 API的设备上运行应用程序,在点击按钮98次,导致GC然后转储HPROF后,您将看到98个实时实例Main2Activity,如http://www.pohrani.com/f/ 1H/GS/4EFlHKoj/sgs4.png
如果您在FULL模式下实现Camera2 API的设备上执行相同操作,您将看到0个实时实例Main2Activity,如http://www.pohrani.com/f/2q/bV/4srUZIJL/sgs6.png
有办法解决这个漏洞吗?
有人可能会问为什么我这样做?在我们公司,我们正在开发条形码和OCR扫描解决方案以及着名的PhotoMath应用程序.因此,我们有扫描活动来控制相机和扫描过程.在启动时,活动会检查设备是否支持Camera2 API FULL或LIMITED模式,并尝试使用它以获得更好的性能,而如果Camera2 API处于LEGACY模式,那么我们更喜欢使用旧相机API使用相机管理,就像我们在前Lollipop上所做的那样设备.
由于提到的内存泄漏,每当将SDK集成到其应用程序中的客户端启动扫描活动,执行扫描并获得结果时,由于该错误,一个扫描活动实例将被泄露.如果客户端扫描很多,这可能会占用超过20 MB的内存 - 这是一个严重的问题!
因此,如果有人知道如何为此问题制定解决方法,我将永远感激不尽!
在我们公司我们正在开发同时包含Java和本机部分的Android SDK。我们以AAR格式打包SDK,其中包含所有资源,java类和本机位。根据AAR规范,本机库应放置在AAR包内的jni文件夹中。由于当前的gradle插件不支持高级NDK用例,并且由于我们有一个非常成熟的Android.mk文件,该文件经过3年的开发,因此我们通过从gradle任务中调用自定义外壳脚本来准备AAR。该Shell脚本使用ndk-build命令构建NDK,并将运行该脚本的任务作为javaCompile任务的依赖项放置(我们的代码有多种形式,每种形式都有自己的NDK规则,这些规则是从定义文件中预先加载的然后作为命令行参数提供给ndk-build)。
最后,当所有内容都被编译后,我们有一个Copy任务,它将本机libs复制到build / intermediates / bundles内的jni文件夹中(该文件夹最终被压缩到AAR中)。在我们更新项目以使用gradle插件v1.5.0之前,此方法一直有效。
在v1.5.0中,将称为Transform API的东西引入了插件。尽管我们不使用它,但此Transform步骤在任务transformNative_libsWithSyncJniLibsForFlavorNameBuildTypeName任务中对本机lib进行了一些转换,该操作发生在将libs复制到jni文件夹中并导致删除jni文件夹中的所有数据之后。这最终将导致不包含本机库的AAR并在需要本机方法时崩溃。
我们通过使用project.tasks[taskName]获取任务来解决此问题,并确保在将libs复制到jni文件夹之前发生该问题。
但是,遇到这个问题已经开始让我们担心,是否以及何时将gradle-experimental插件(当前唯一支持NDK的插件)退出试验阶段,并将成为构建NDK代码的标准。
我们对该实验性插件进行了一些实验,除了语法不同(为什么?)外,它不支持将调试本机代码作为库模块的一部分(gdb文件未打包到AAR中,并且jniDebuggable标志不再存在)。
有谁知道此插件何时将达到稳定的API并准备在生产版本中使用?我们想从shell脚本到gradle这个只NDK建立相同的功能奇偶校验(加上C ++从Android的工作室,这是不可能的当前配置编辑免费支持未雨绸缪我们从调用NDK建造迁移,所以我们依靠不同的编辑器的JNI胶水代码)。
c++ android android-ndk android-gradle-plugin gradle-experimental
我想在 docker 环境中使用 headless chrome 来运行编译为 Web 程序集的 C++ 测试。
我已确保我的测试可执行文件与--emrun标志链接,以确保所有输出都发布到 emrun 服务器并打印到控制台(然后由 CTest 框架捕获)。
但是,当运行无头铬时
emrun --browser=chrome --browser_args="--no-sandbox --disable-gpu --use-gl=swiftshader --headless" ./MyTestExecutable.html --gtest_filter=MyTestFixture.myTest
Run Code Online (Sandbox Code Playgroud)
没有任何内容打印到输出中。但是,如果我将命令更改为
emrun --browser=chrome --browser_args="--no-sandbox --disable-gpu --use-gl=swiftshader --headless --remote-debugging-port=9222" ./MyTestExecutable.html --gtest_filter=MyTestFixture.myTest
Run Code Online (Sandbox Code Playgroud)
测试输出很高兴地打印到命令行,但如果输出超过 cca 9kB,则会被截断,这是它自己的问题 - 见下文。但是,chrome 调试会话保持挂起并使用端口 9222。我当前的解决方法是确保 CTest 框架中的每个单元测试都有自己独特的调试端口,并让 chrome 会话保持生成状态,直到容器停止 - docker 清理它们那就起来吧。这个解决方案很脏,我不喜欢它。
--remote-debugging-port我想知道是否有人知道如果没有提供给 Chrome,为什么 emrun 服务器不会打印任何内容?
我的预感是,chrome 在完成执行后会停止向 emrun 服务器发送数据,并且启用调试会以某种方式减慢 chrome 的速度,从而为至少一些输出发送到 emrun 服务器腾出时间(这也解释了大输出大小的截断) 。
我还去查看了 Emscripten 人员如何运行他们的 CI 测试,发现他们在 Xvfb 下使用完整的 chrome,而不是 headless chrome。我也尝试过,但是,这导致了一些其他问题,例如如果在容器内运行但不是以 root 用户身份运行,则 chrome 会因 SIGTRAP 崩溃,而 …
我想使用libc ++ STL库而不是默认的GNU STL从源代码构建OpenCV.LibC++提供更好的C++ 11和C++ 14支持.有可能吗?
android ×3
c++ ×3
android-ndk ×2
camera ×1
cmake ×1
docker ×1
emscripten ×1
freeze ×1
headless ×1
libc++ ×1
memory-leaks ×1
nexus-10 ×1
opencv ×1
stl ×1
xcode ×1