yocto sdk和rootfs加入自定義動態庫

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;
}

 

在更新的yocto中又遇到了如下問題

do_package_qa: QA Issue: No GNU_HASH in the elf binary: '/home/qiuhui/imx8_4.16/build-mek/tmp/work/aarch64-poky-linux/fubversion/0.1-1/packages-split/fubversion/usr/lib/libfubversion.so.1' [ldflags]

可加入如下命令解決

TARGET_CC_ARCH += "${LDFLAGS}"

同時還查到如下命令,此命令未驗證
ERROR_QA_remove = "ldflags"

 

 

在做另一個limessage.so的時候又遇到了另一個問題

ERROR: nativesdk-libmessage-0.1-1 do_package: QA Issue: nativesdk-libmessage: Files/directories were installed but not shipped in any package:
  /usr
  /usr/include
  /usr/lib
  /usr/include/manager.h
  /usr/include/GDef.h
  /usr/include/message.h
  /usr/include/uart.h
  /usr/include/EventCenter.h
  /usr/include/TimerControl.h
  /usr/include/Timer.h
  /usr/lib/libfubversion.so
  /usr/lib/libmessage.so.1
  /usr/lib/libmessage.so
Please set FILES such that these items are packaged. Alternatively if they are unneeded, avoid installing them or delete them within do_install.
nativesdk-libmessage: 13 installed and not shipped files. [installed-vs-shipped]
ERROR: nativesdk-libmessage-0.1-1 do_package: Fatal QA errors found, failing task.
ERROR: nativesdk-libmessage-0.1-1 do_package: Function failed: do_package
ERROR: Logfile of failure stored in: /home/timotheus/ext_sdb/hm02/krogoth/build-wayland-e115-arhud/tmp/work/x86_64-nativesdk-pokysdk-linux/nativesdk-libmessage/0.1-1/temp/log.do_package.12245
ERROR: Task 11 (virtual:nativesdk:/home/timotheus/ext_sdb/hm02/krogoth/sources/meta-autofuture/recipes-autofuture/application/libmessage_0.1.bb, do_package) failed with exit code '1'

加入
INSANE_SKIP_${PN} += "installed-vs-shipped"

 

如果是想編譯到文件系統而非SDK的話則在以上基礎去掉,不然單獨編譯通過但編譯鏡像的時候無法通過

BBCLASSEXTEND = "native nativesdk"

編譯到系統鏡像的時候可以在build/conf/local.conf加入

IMAGE_INSTALL_append += "libmessage "

 

 

文中相關代碼

https://download.csdn.net/download/bgk112358/10770983

https://download.csdn.net/download/BGK112358/12006700

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章