在VSCode中自动配置Yocto SDK环境变量以实现CMake交叉编译
问题描述
我正在Ubuntu系统的VSCode中搭建基于Yocto SDK与CMake的交叉编译环境,必须在项目文件夹启动VSCode前配置好必要的环境变量。目前我通过终端执行以下命令设置环境变量:
$ source /opt/poky/3.1.2/environment-setup-XxXxXx
如果缺少这些环境变量,CMake就找不到所需依赖。我想知道能不能在VSCode内自动化这个步骤,让每次打开项目时自动配置Yocto SDK环境变量,比如通过修改settings.json或者其他方法实现?
更新#1
附上环境变量配置脚本内容:
if [ ! -z "$LD_LIBRARY_PATH" ]; then echo "Your environment is misconfigured, you probably need to 'unset LD_LIBRARY_PATH'" echo "but please check why this was set in the first place and that it's safe to unset." echo "The SDK will not operate correctly in most cases when LD_LIBRARY_PATH is set." echo "For more references see:" echo " http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html#AEN80" echo " http://xahlee.info/UnixResource_dir/_/ldpath.html" return 1 fi export SDKTARGETSYSROOT=/opt/poky/3.3.4/sysroots/corei7-64-poky-linux export PATH=/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/usr/bin:/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/usr/sbin:/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/bin:/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/sbin:/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/usr/bin/../x86_64-pokysdk-linux/bin:/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/usr/bin/x86_64-poky-linux:/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/usr/bin/x86_64-poky-linux-musl:$PATH export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig:$SDKTARGETSYSROOT/usr/share/pkgconfig export CONFIG_SITE=/opt/poky/3.3.4/site-config-corei7-64-poky-linux export OECORE_NATIVE_SYSROOT="/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux" export OECORE_TARGET_SYSROOT="$SDKTARGETSYSROOT" export OECORE_ACLOCAL_OPTS="-I /opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/usr/share/aclocal" export OECORE_BASELIB="lib" export OECORE_TARGET_ARCH="x86_64" export OECORE_TARGET_OS="linux" unset command_not_found_handle export CC="x86_64-poky-linux-gcc -m64 -march=nehalem -mtune=generic -mfpmath=sse -msse4.2 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=$SDKTARGETSYSROOT" export CXX="x86_64-poky-linux-g++ -m64 -march=nehalem -mtune=generic -mfpmath=sse -msse4.2 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=$SDKTARGETSYSROOT" export CPP="x86_64-poky-linux-gcc -E -m64 -march=nehalem -mtune=generic -mfpmath=sse -msse4.2 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=$SDKTARGETSYSROOT" export AS="x86_64-poky-linux-as " export LD="x86_64-poky-linux-ld --sysroot=$SDKTARGETSYSROOT" export GDB=x86_64-poky-linux-gdb export STRIP=x86_64-poky-linux-strip export RANLIB=x86_64-poky-linux-ranlib export OBJCOPY=x86_64-poky-linux-objcopy export OBJDUMP=x86_64-poky-linux-objdump export READELF=x86_64-poky-linux-readelf export AR=x86_64-poky-linux-ar export NM=x86_64-poky-linux-nm export M4=m4 export TARGET_PREFIX=x86_64-poky-linux- export CONFIGURE_FLAGS="--target=x86_64-poky-linux --host=x86_64-poky-linux --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT" export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types " export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types " export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-z,relro,-z,now" export CPPFLAGS="" export KCFLAGS="--sysroot=$SDKTARGETSYSROOT" export OECORE_DISTRO_VERSION="3.3.4" export OECORE_SDK_VERSION="3.3.4" export ARCH=x86 export CROSS_COMPILE=x86_64-poky-linux- # Append environment subscripts if [ -d "$OECORE_TARGET_SYSROOT/environment-setup.d" ]; then for envfile in $OECORE_TARGET_SYSROOT/environment-setup.d/*.sh; do . $envfile done fi if [ -d "$OECORE_NATIVE_SYSROOT/environment-setup.d" ]; then for envfile in $OECORE_NATIVE_SYSROOT/environment-setup.d/*.sh; do . $envfile done fi
解决方案
方法1:通过VSCode的settings.json直接配置环境变量
将Yocto SDK脚本中定义的环境变量提取出来,添加到项目的.vscode/settings.json里,VSCode的终端、CMake工具链都会自动加载这些变量:
{ "terminal.integrated.env.linux": { "LD_LIBRARY_PATH": "", "SDKTARGETSYSROOT": "/opt/poky/3.3.4/sysroots/corei7-64-poky-linux", "PATH": "/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/usr/bin:/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/usr/sbin:/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/bin:/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/sbin:/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/usr/bin/../x86_64-pokysdk-linux/bin:/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/usr/bin/x86_64-poky-linux:/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/usr/bin/x86_64-poky-linux-musl:$PATH", "PKG_CONFIG_SYSROOT_DIR": "/opt/poky/3.3.4/sysroots/corei7-64-poky-linux", "PKG_CONFIG_PATH": "/opt/poky/3.3.4/sysroots/corei7-64-poky-linux/usr/lib/pkgconfig:/opt/poky/3.3.4/sysroots/corei7-64-poky-linux/usr/share/pkgconfig", "CONFIG_SITE": "/opt/poky/3.3.4/site-config-corei7-64-poky-linux", "OECORE_NATIVE_SYSROOT": "/opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux", "OECORE_TARGET_SYSROOT": "/opt/poky/3.3.4/sysroots/corei7-64-poky-linux", "OECORE_ACLOCAL_OPTS": "-I /opt/poky/3.3.4/sysroots/x86_64-pokysdk-linux/usr/share/aclocal", "OECORE_BASELIB": "lib", "OECORE_TARGET_ARCH": "x86_64", "OECORE_TARGET_OS": "linux", "CC": "x86_64-poky-linux-gcc -m64 -march=nehalem -mtune=generic -mfpmath=sse -msse4.2 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/opt/poky/3.3.4/sysroots/corei7-64-poky-linux", "CXX": "x86_64-poky-linux-g++ -m64 -march=nehalem -mtune=generic -mfpmath=sse -msse4.2 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/opt/poky/3.3.4/sysroots/corei7-64-poky-linux", "CPP": "x86_64-poky-linux-gcc -E -m64 -march=nehalem -mtune=generic -mfpmath=sse -msse4.2 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/opt/poky/3.3.4/sysroots/corei7-64-poky-linux", "AS": "x86_64-poky-linux-as", "LD": "x86_64-poky-linux-ld --sysroot=/opt/poky/3.3.4/sysroots/corei7-64-poky-linux", "GDB": "x86_64-poky-linux-gdb", "STRIP": "x86_64-poky-linux-strip", "RANLIB": "x86_64-poky-linux-ranlib", "OBJCOPY": "x86_64-poky-linux-objcopy", "OBJDUMP": "x86_64-poky-linux-objdump", "READELF": "x86_64-poky-linux-readelf", "AR": "x86_64-poky-linux-ar", "NM": "x86_64-poky-linux-nm", "M4": "m4", "TARGET_PREFIX": "x86_64-poky-linux-", "CONFIGURE_FLAGS": "--target=x86_64-poky-linux --host=x86_64-poky-linux --build=x86_64-linux --with-libtool-sysroot=/opt/poky/3.3.4/sysroots/corei7-64-poky-linux", "CFLAGS": " -O2 -pipe -g -feliminate-unused-debug-types ", "CXXFLAGS": " -O2 -pipe -g -feliminate-unused-debug-types ", "LDFLAGS": "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-z,relro,-z,now", "CPPFLAGS": "", "KCFLAGS": "--sysroot=/opt/poky/3.3.4/sysroots/corei7-64-poky-linux", "OECORE_DISTRO_VERSION": "3.3.4", "OECORE_SDK_VERSION": "3.3.4", "ARCH": "x86", "CROSS_COMPILE": "x86_64-poky-linux-" }, "cmake.environment": { "SDKTARGETSYSROOT": "/opt/poky/3.3.4/sysroots/corei7-64-poky-linux", "CC": "x86_64-poky-linux-gcc -m64 -march=nehalem -mtune=generic -mfpmath=sse -msse4.2 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/opt/poky/3.3.4/sysroots/corei7-64-poky-linux" } }
方法2:自定义VSCode启动脚本
创建一个名为vscode-yocto.sh的启动脚本,内容如下:
#!/bin/bash unset LD_LIBRARY_PATH source /opt/poky/3.3.4/environment-setup-corei7-64-poky-linux code .
给脚本添加执行权限:
chmod +x vscode-yocto.sh
之后每次通过这个脚本启动项目,VSCode就会自动加载Yocto的环境变量。
方法3:利用VSCode Tasks自动加载环境
在项目的.vscode/tasks.json中定义编译任务,让任务先加载Yocto环境变量再执行编译:
{ "version": "2.0.0", "tasks": [ { "label": "CMake Build", "type": "shell", "command": "unset LD_LIBRARY_PATH && source /opt/poky/3.3.4/environment-setup-corei7-64-poky-linux && cmake --build build", "group": { "kind": "build", "isDefault": true }, "problemMatcher": "$gcc" } ] }
执行编译任务时,会自动完成Yocto环境变量的加载。
方法4:使用VSCode环境变量插件
安装Env Vars插件,在插件配置中指定Yocto SDK脚本的路径,插件会在VSCode启动时自动source该脚本,完成环境变量配置。
内容的提问来源于stack exchange,提问作者pmundt
相关产品推荐
相关产品推荐

