yocto有現成的sdk配方指令,例如
bitbake xxxx-image -c populate_sdk
可生成系統默認存在的開發工具,如果想加入自定義的動態庫可用如下方法
在系統中加入版本號接口,本地編寫代碼並確定能編譯成動態庫,生成動態庫的makefile如下
SOURCES = fubversion.cpp
OBJS = $(patsubst %.cpp, %.o, $(SOURCES))
CFLAGS := -Wall -O3 -std=c++0x
# INC_PATH =
# LIB_PATH =
LIB = libfubversion.so
all: $(LIB)
$(OBJS): $(SOURCES)
$(CXX) $(CFLAGS) -fpic -c $< -o $@ $(INC_PATH) $(LIB_PATH)
$(LIB): $(OBJS)
rm -f $@
$(CXX) -shared -o $@ $(OBJS)
rm -f $(OBJS)
tags:
ctags -R *
clean:
rm -f $(OBJS) $(TARGET) $(LIB)
然後將其放入yocto系統裏,按照如下方法寫bb文件,此文件調試後未整理,可能存在冗餘
DESCRIPTION = "fub version library"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
PR = "1"
SRC_URI = "file://source-code \
file://patch \
file://source-code/libfubversion.so"
# DEPENDS = "glib-2.0"
S = "${WORKDIR}/source-code/"
do_compile() {
make
}
do_install() {
install -d ${D}/usr/lib
cp ${WORKDIR}/source-code/libfubversion.so ${WORKDIR}/source-code/libfubversion.so.${PR}
install -m 0755 ${WORKDIR}/source-code/libfubversion.so.${PR} ${D}/usr/lib
install -m 0755 ${WORKDIR}/source-code/libfubversion.so ${D}/usr/lib
cd ${D}/usr/lib/
ln -sf libfubversion.so.${PR} libfubversion.so
install -d ${D}/usr/include
install -m 0644 ${WORKDIR}/source-code/fubversion.h ${D}/usr/include/
}
INHIBIT_PACKAGE_STRIP = "1"
FILES_${PN} += "${libdir}/*.so"
FILES_${PN}-dbg += "${libdir}/.debug"
FILES_SOLIBSDEV = ""
INSANE_SKIP_${PN} = "dev-so"
BBCLASSEXTEND = "native nativesdk"
此處有幾個關鍵的字段
該字段可將相關動態庫生成到sdk中
BBCLASSEXTEND = "native nativesdk"
在SDK裏還需要一個頭文件,此處的頭文件的安裝不規範,但可以使用
到此,將一個包含自定義的動態庫生成到sdk已經完成了,但動態庫需要同時放到文件系統中,編譯系統指令,如
bitbake xxxx-image
將動態庫編譯到文件系統規則多一些,如
其中.so爲鏈接文件不可少,否者會提示鏈接文件缺失,大概如下一類錯誤
QA Issue: non -dev/-dbg/-nativesdk package contains symlink .so
QA Issue: -dev package contains non-symlink .so
在do_instll製作.so鏈接文件和對應的動態庫後,不會自動將鏈接文件和動態庫一併生成到文件系統裏
在fubversion配方的image文件夾裏是存在.so和動態鏈接文件的,但是在最終的文件系統卻沒有.so鏈接文件
這與do_package_qa一類的規則有關,解決辦法
FILES_${PN} += "${libdir}/*.so"
FILES_${PN}-dbg += "${libdir}/.debug"
FILES_SOLIBSDEV = ""
INSANE_SKIP_${PN} = "dev-so"
此時纔會將.so鏈接文件和對應的動態鏈接庫都安裝到文件系統裏
上邊說的頭文件的問題在這裏也有,就是會將頭文件也安裝到文件系統裏,這是不需要的,以後在加入sdk頭文件的安裝方法
文件系統完成,系統的鏡像也同步好了,測試驗證
寫一個測試app,makefile,讀取版本號
makefile
# INCLUDE = -I $(SDK_ROOT_DIR)/usr/include
LIBS = -lversion
LDFLAGS += $(LIBS)
CPPFLAGS += $(INCLUDE)
TARGET = app_get_version
TARGET_DIR = .
SOURCES = app.cpp
OBJ_FILES = $(patsubst %.cpp, %.o, $(SOURCES))
all: check_env compile link
check_env:
@echo "[$(TARGET)]: Build Start..."
@mkdir -p $(TARGET_DIR)
@echo ${CXX}
compile: $(OBJ_FILES)
link:
@echo "[$(TARGET)]: Linking ..."
@$(CXX) $(OBJ_FILES) $(LDFLAGS) -o $(TARGET_DIR)/$(TARGET)
rm -f $(OBJ_FILES)
@echo "[$(TARGET)]: Build done!"
#complie step 1:
$(OBJ_FILES): %.o: %.cpp
@echo "[$(TARGET)]: Compiling $(notdir $^) ..."
@$(CXX) -c $(CPPFLAGS) $< -o $@
clean:
@rm -rf $(OBJ_FILES) $(TARGET_DIR)/$(TARGET)
@echo "[$(TARGET)]: Clean Finish!"
應用程序就無需關心版本號的管理怎麼實現的,通過非常簡單的sdk接口獲得版本號達到目的
#include <fubversion.h>
#include <iostream>
#include <string>
int main ()
{
std::string sVerBuff;
sVerBuff.clear();
sVerBuff = VersionInfo::GetInstance()->GetVersionInfo("ro.build.fub.version");
printf ("%s \n", sVerBuff.c_str());
return 0;
}
文中相關代碼
https://download.csdn.net/download/bgk112358/10770983