我正在尝试将uGFX库静态地构建到我的主二进制文件中。我正在交叉编译。我的构建系统是Ubuntu Linux,主机是ARM环境。 构建成功,但是在我的主机上执行二进制文件时,以下消息不断困扰我:
binary_name:/lib/libc.so.6:找不到版本'GLIBC_2.17'(binary_name必需)
仅当将uGFX源包含到我的二进制文件中时,才会发生这种情况。这就是我的CMakeLists.txt的外观:
cmake_minimum_required(VERSION 3.9.1)
project(MyBinary)
set(CMAKE_C_FLAGS_DEBUG "-nostdinc -fsigned-char -Wstrict-prototypes -Wno-trigraphs -Wimplicit -Wformat")
set(CMAKE_CXX_FLAGS_DEBUG "-nostdinc++ -fsigned-char -Wno-trigraphs -Wimplicit -Wformat")
include_directories(./include
./include/ugfx
./ExternalProjects/ugfx
./ExternalProjects/ugfx/drivers/gdisp/framebuffer
/usr/gnueabi/lib/gcc/arm-brcm-linux-gnueabi/6.3.0/include
/usr/arm-linux-gnueabi/include
/usr/arm-linux-gnueabi/include/linux)
link_directories(/usr/gnueabi/arm-brcm-linux-gnueabi/sysroot/lib)
set(SOURCE_FILES
./ExternalProjects/ugfx/src/gfx_mk.c
./ExternalProjects/ugfx/drivers/gdisp/framebuffer/gdisp_lld_framebuffer.c
./ExternalProjects/ugfx/drivers/ginput/touch/Linux-Event/gmouse_lld_linux_event.c
MyBinary.c)
add_executable(MyBinary ${SOURCE_FILES})
target_link_libraries(MyBinary curl ssl)
我的工具链cmake文件:
include(CMakeForceCompiler)
set(CMAKE_CROSSCOMPILING 1)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_SYSROOT /usr/gnueabi/arm-brcm-linux-gnueabi/sysroot)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CROSS_COMPILER arm-linux-gnueabi)
set(CMAKE_C_COMPILER "/usr/gnueabi/bin/arm-brcm-linux-gnueabi-gcc")
set(CMAKE_CXX_COMPILER "/usr/gnueabi/bin/arm-brcm-linux-gnueabi-gcc")
使用objdump检查二进制文件时,我注意到以下内容:
Version References:
required from libc.so.6:
0x06969197 0x00 04 GLIBC_2.17
0x0d696914 0x00 03 GLIBC_2.4
r equired from libpthread.so.0:
0x0d696914 0x00 02 GLIBC_2.4
解释我收到的消息。进一步检查objdump -T
会发现以下内容:
...
00000000 DF *UND* 00000000 GLIBC_2.4 abort
00000000 DF *UND* 00000000 GLIBC_2.17 clock_gettime
00000000 DF *UND* 00000000 GLIBC_2.4 system
...
我尝试了链接器选项nodefaultlibs和nostdlib。 libc.so.6
文件在sysroot中可用。我甚至尝试在CMakeLists.txt中使用find_library(MYLIBC c-2.25 PATHS /usr/gnueabi/arm-brcm-linux-gnueabi/sysroot/lib)
并将其包含在我的target_link_libraries
中作为二进制文件,但是在那里也没有运气。
如何确保工具链libc与我的二进制文件链接?
更新1
首先回答问题。是的,我尝试将libc静态链接到我的二进制文件。但是然后二进制文件太大了。好吧,该设备因SIGSEGV
而崩溃。此外,我不希望静态链接clib,因为最终我也希望uGFX
也被动态链接。静态地将libc链接到共享的库是行不通的。我还可以将所有内容静态链接在一起,但是二进制文件将变得庞大,将来在更新单个库时将不会非常方便。
在设备上libc.so.6
存在。我设法得到了文件系统的转储。它位于主机的/lib
目录中。此外,我在没有uGFX
的情况下上传的二进制文件可以与GLIBC_2.4
一起使用,并且可以很好地动态链接。
主机系统正在运行以下操作系统:
Linux(无)2.6.32.9#1 PREEMPT周二1月16日11:00:00 CST 2018 armv6l GNU / Linux
此外,关于静态链接到二进制文件,上述cmake
文件可能不清楚。这些示例显示了uGFX
的源已添加到二进制文件本身。但是我最初尝试使用以下方法:
# Find libc-2.25.so in sysroot (which lives there)
find_library(MYLIBC c-2.25 PATHS /usr/gnueabi/arm-brcm-linux-gnueabi/sysroot/lib)
add_library(gfx STATIC
./ExternalProjects/ugfx/src/gfx_mk.c
./ExternalProjects/ugfx/drivers/gdisp/framebuffer/gdisp_lld_framebuffer.c
./ExternalProjects/ugfx/drivers/ginput/touch/Linux-Event/gmouse_lld_linux_event.c)
target_link_libraries(gfx ${MYLIBC})
target_link_libraries(MyBinary ${MYLIBC} gfx curl ssl)
更新2
通过将以下行添加到库中,我设法摆脱了GLIB依赖项消息:
asm(".symver clock_gettime,clock_gettime@");
链接问题结束了,现在它终止于以下内容:
[TERMINATION] errorNum = 11 POSIX信号11:SIGSEGV
当我静态链接所有内容时,这看起来就像是同一件事。我将对此进行进一步调查。如果有人有什么想法,我想听听他们:)
答案 0 :(得分:1)
找到了解决问题的方法。原来,我需要添加以下编译器标志:-lrt。这将链接包含clock_gettime
函数的实时扩展库。因此,我不需要asm
骇客,这不是解决此问题的方法。
对于SIGSEGV
,您需要自己初始化uGFX的电路板。对于我的framebuffer,可以在board_framebuffer.h中找到。功能static void board_init(GDisplay *g, fbInfo *fbi)
需要被编辑。在这里,我映射了帧缓冲区(/dev/fb0
)并将其分配给fbi->pixels
。后者默认设置为0,这会导致SIGSEGV。
必须将board_framebuffer.h文件从${ugfx_src}/drivers/gdisp/framebuffer/board_framebuffer_template.h
复制到项目的include dir并重命名。
另外,在这种情况下,您可以使用board_framebuffer.h
中的帧缓冲板文件${ugfx_src}/boards/base/Linux-Framebuffer/board-framebuffer.h
。
答案 1 :(得分:0)
您构建的库需要动态库libc
,但是您的主机操作系统没有。请告诉我们您正在运行哪个操作系统?它是否包含动态库libc
。
libc
库,请确保正确的链接库目录libc
,在构建uGFX
时是否可以使用静态库代替,或者仅将libc.so
从工具链目录(应该存在)复制到主机中lib path
,然后重试。