admin 发布的文章

家里的电脑上,安装了Arch32与Arch64。不记得以前做过什么操作,

导致在Arch32下,Thunar启动后,其环境变量缺失很多内容。

主要在PATH及LD_LIBRARY_PATH几个关键变量缺失,导致很多功能使用不便

经过几天的摸索,终于找到原凶。

现象是:Thunar启动后,环境变量缺失很多

定位经历:由于同时有Arch32与Arch64,因此可以反复启动对比。

首先找到线索:

1.通过进程树对比,有问题的环境下,Thunar启动后的父进程是Systemd

2.而正常环境下,Thunar启动后的父进程是xfce4-session

同时查看其启动参数,得到信息

1.有问题的环境下,Thunar启动参数是 --daemon

2.正常环境则会带--sm-id xxxxxxxxxx-yyyyyyyyy字样

从XFCE4启动流程可知,xfce4-session负责拉起包括xfdesktop/xfce4-panel/thunar等多个进程

因此问题原因推进到Thunar的启动方式不正确。

定位手段不足,反复查看systemd等的系统日志,也没查找到有启动Thunar失败的提示。

无奈去查xfce-session的代码,发现其提供调试手段,环境变量中有XFSM_VERBOSE时,会记录日志到当前用户目录下

在/etc/profile中增加变量XFSM_VERBOSE后,对比问题环境、正常环境的日志,发现在在XFSM模块加载初始会话时,就缺少Thunar项

原因定位到了,就是初始会话中缺少Thunar。

xfce-session启动时,先根据初始会话,依次加载启动每个APP。

加载完成后,会检查XFCE4几个关键组件是否启动,如果没有启动,则以Failsafe方式启动缺失的组件。

Thunar正是由此启动起来的。

修复办法,首先在问题环境中,进系统后打开“启动与会话”,然后删除相应缺省会话,重启发生不生效!

想了一下,XFCE4在正常退出时,会自动保存当前会话,因此操作就没有作用。

最后还是得手工来操作:进入正常环境,将问题环境的分区mount上来,找到HOME目录下进入到

~/.cache/sessions,删除xfce相应的信息

再进入问题环境,可以发现环境已经修复。

 

android studio的CMakeLists.txt写好后,在Studio中编译没问题,在命令编译时则需要配置很多参数才能成功

示例CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.4.1)set(UVC_LIBS UVCCamera uvc usb100 jpeg-turbo1500)
FOREACH(UVC_LIB ${UVC_LIBS})
add_library(${UVC_LIB} SHARED IMPORTED)
set_target_properties(${UVC_LIB} PROPERTIES IMPORTED_LOCATION
${CMAKE_CURRENT_SOURCE_DIR}
/lib/${ANDROID_ABI}/lib${UVC_LIB}.so) ENDFOREACH(UVC_LIB)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DFFFFFFF_DETECTOR_EXPORT -std=c++11")

add_library(XXXXX SHARED
${CMAKE_CURRENT_SOURCE_DIR}
/src/BBBB/XDFD.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/BBBB/DFDSF.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/BBBB/base64/CBase64.cpp
${CMAKE_CURRENT_SOURCE_DIR}
/src/BBBB/camera/AAAA.cpp )

target_include_directories(XXXXX PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
/inc ${CMAKE_CURRENT_SOURCE_DIR}/src/XXX)

target_link_libraries(SL3DCameraCtrl
${UVC_LIBS}
android
log)

由于使用了STL,整个CMAKE执行的命令行写成如下:

D:\10.AndroidSDK\cmake\3.10.2.4988404\bin\cmake.exe -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE="%ANDROID_NDK%\build\cmake\android.toolchain.cmake" ..\..\ -DCMAKE_MAKE_PROGRAM="%ANDROID_NDK%\prebuilt\windows-x86_64\bin\make.exe" -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-21 -DANDROID_STL=c++_static

用于编译的批处理文件如下:

set ANDROID_NDK=D:\10.AndroidSDK\ndk\android-ndk-r15bmkdir build\arm64-v8acd    build\arm64-v8a

D:
\10.AndroidSDK\cmake\3.10.2.4988404\bin\cmake.exe -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE="%ANDROID_NDK%\build\cmake\android.toolchain.cmake" ..\..\ -DCMAKE_MAKE_PROGRAM="%ANDROID_NDK%\prebuilt\windows-x86_64\bin\make.exe" -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-21 -DANDROID_STL=c++_static
D:
\10.AndroidSDK\cmake\3.10.2.4988404\bin\cmake.exe --build . cd ..\..\

 

编译一个安卓下的so,此so依赖其他的库,通过循环简化操作

set(UVC_LIBS UVCCamera uvc usb100 jpeg-turbo1500)FOREACH(UVC_LIB ${UVC_LIBS})add_library(${UVC_LIB} SHARED IMPORTED)set_target_properties(${UVC_LIB} PROPERTIES IMPORTED_LOCATION${CMAKE_CURRENT_SOURCE_DIR}/lib/${ANDROID_ABI}/lib${UVC_LIB}.so)ENDFOREACH(UVC_LIB)

 

最近将一个DLL库移植至安卓下,编译出so文件。

经历makefile、cmake等等的入门到放弃.....

最后还是使用android的ndk编译命令来解决

每个NDK文件下,均包含的是所有工具链、头文件、库文件等

执行ndk-build命令,诸如:D:\10.AndroidSDK\ndk\android-ndk-r15b\ndk-build.cmd,则是使用R15版本的NDK编译

ndk-build编译时,会在指定工作目录下查找jni/Android.mk及jni/Application.mk,这两个文件也是标准makefile

Application.mk中定义一个APP下所有的选项,诸如编译几个ABI、编译时使用什么STL

示例:

# 不写 APP_ABI 会生成全部支持的平台,目前支持:armeabi arm64-v8a armeabi-v7a
# APP_ABI :
= armeabi arm64-v8a armeabi-v7a mips mips64 x86 x86_64
# APP_ABI :
=all
APP_ABI :
= arm64-v8a
APP_STL :
= c++_static

Android.mk则定义一个或多个模块的编译,限定了相应宏来确定模块名、相应源代码文件

示例:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# 要生成的.so库名称。java代码System.loadLibrary(
"hello");加载的就是它
LOCAL_MODULE :
=XXXXXX

# C
++文件
LOCAL_SRC_FILES :
= ../src/XXX/AAA.cpp\
..
/src/XXX/BBB.cpp\
..
/src/XXX/base64/CBase64.cpp\
..
/src/XXX/BB/FF.cppLOCAL_C_INCLUDES := $(LOCAL_PATH)/../inc $(LOCAL_PATH)/../src/XXX

LOCAL_CFLAGS :
= -DXXX_EXPORT

LOCAL_LDLIBS :
= -luvc -lusb100 -ljpeg-turbo1500

LOCAL_LDFLAGS :
= -L$(LOCAL_PATH)/../lib/$(TARGET_ARCH_ABI) -lm -llog

# LOCAL_LDFLAGS :
= -L$(LOCAL_PATH)/../lib/$(TARGET_ARCH_ABI)-luvc -lusb100 -ljpeg-turbo1500 -lm -llog

include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE指定的是模块名
LOCAL_SRC_FILES指定相应的源代码文件

其中Android.mk中使用的宏名TARGET_ARCH_ABI,即Application.mk下面APP_ABI的当前项ABI
include $(BUILD_SHARED_LIBRARY)表示编译的是一个共享库

如果想编译多个模块,则应该在
include $(BUILD_SHARED_LIBRARY)后面,使用include $(CLEAR_VARS)清除变量,
增加更多模块。