【问题标题】:Importing (RTEMS ) libraries in CMake在 CMake 中导入 (RTEMS) 库
【发布时间】:2020-12-09 16:28:38
【问题描述】:

我正在尝试以现代方式在 CMake 中导入库,如该线程中所示: How do I add a library path in cmake?

目标是构建 RTEMS 测试程序。我在 Ubuntu 20.04 机器上构建,我正在使用 arm/stm32h7 BSP 交叉编译 ARM 目标。

这些库位于外部 lib 文件夹中。 我几乎让构建过程正常工作,但是 CMake 似乎做了一些破坏链接过程的事情。我可能犯了这个错误,但我很难弄清楚。

这是我的 CMake 文件的基本设置,在我为 RTEMS 二进制文件的交叉编译设置了所有内容之后:

...
# Here comes application stuff again

add_executable(${CMAKE_PROJECT_NAME} init.c led.c stm32h7xx_nucleo.c)

set(RTEMS_LIB_NAME "rtems_${RTEMS_ARCH_NAME}_${RTEMS_BSP_NAME}")
add_library(${RTEMS_LIB_NAME} SHARED IMPORTED)
set_target_properties(${RTEMS_LIB_NAME} PROPERTIES
    IMPORTED_LOCATION ${RTEMS_BSP_LIB_PATH}
    INTERFACE_INCLUDE_DIRECTORIES ${RTEMS_BSP_INC_PATH}
)

#target_link_directories(${RTEMS_LIB_NAME} INTERFACE
#   ${RTEMS_BSP_LIB_PATH}
#)
#target_include_directories(${RTEMS_LIB_NAME} INTERFACE
#   ${RTEMS_BSP_INC_PATH}
#)
target_link_options(${RTEMS_LIB_NAME} INTERFACE
#   -I${RTEMS_BSP_INC_PATH}
#   -B${RTEMS_BSP_LIB_PATH}
    -Wl,--gc-sections 
    -Wl,-Bstatic 
    -Wl,-Bdynamic 
    -qrtems
)

target_link_libraries(${CMAKE_PROJECT_NAME} ${RTEMS_LIB_NAME})

构建单个源文件似乎工作正常。 CMake 尝试的原始链接命令如下:

/home/rmueller/Documents/RTEMS/toolchain/rtems/6/bin/arm-rtems6-gcc   
-mthumb -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard 
-Wl,--gc-sections -Wl,-Bstatic -Wl,-Bdynamic 
-qrtems CMakeFiles/blinky.dir/init.c.o CMakeFiles/blinky.dir/led.c.o CMakeFiles/blinky.dir/stm32h7xx_nucleo.c.o  
-o blinky -Wl,-rpath,/home/rmueller/Documents/RTEMS/toolchain/rtems
/6/arm-rtems6/stm32h7 /home/rmueller/Documents/RTEMS/toolchain/rtems/6/arm-rtems6/stm32h7/lib 

我得到了错误:

./../../../arm-rtems6/bin/ld: cannot open linker script file linkcmds: No such file or directory

这可能是因为库不知何故不在搜索路径中。 然后我发现以下命令正确链接了二进制文件:

/home/rmueller/Documents/RTEMS/toolchain/rtems/6/bin/arm-rtems6-gcc  
-mthumb -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard 
-Wl,--gc-sections -Wl,-Bstatic -Wl,-Bdynamic 
-qrtems CMakeFiles/blinky.dir/init.c.o CMakeFiles/blinky.dir/led.c.o 
CMakeFiles/blinky.dir/stm32h7xx_nucleo.c.o  -o blinky   
-L/home/rmueller/Documents/RTEMS/toolchain/rtems/6/arm-rtems6/stm32h7/lib

是不是导入库的方式不对?我可以使用诸如 target_link_options 之类的命令手动将 -L 标志添加到我的构建目标中,但我认为如果在链接 RTEMS 库时搜索路径只是一个接口要求,那就太好了。

更新:我想我发现了一个错误:我将库路径作为SHARED 库导入,并且它可能必须作为STATIC 导入。 该命令现在看起来像这样:

/home/rmueller/Documents/RTEMS/toolchain/rtems/6/bin/arm-rtems6-gcc   -mthumb 
-mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard -Wl,--gc-sections -Wl,-Bstatic -Wl,-Bdynamic -qrtems 
CMakeFiles/blinky.dir/init.c.o CMakeFiles/blinky.dir/led.c.o CMakeFiles/blinky.dir/stm32h7xx_nucleo.c.o  
-o blinky  /home/rmueller/Documents/RTEMS/toolchain/rtems/6/arm-rtems6/stm32h7/lib 

更新2:

我解决了这个问题。仍然有一点语法错误,我认为引号丢失了。设置库属性的命令现在看起来像这样:

set_target_properties(${RTEMS_LIB_NAME} PROPERTIES
    IMPORTED_LOCATION "${RTEMS_BSP_LIB_PATH}"
    INTERFACE_INCLUDE_DIRECTORIES "${RTEMS_BSP_INC_PATH}"
)

并且二进制文件已正确链接:-)

更新3:

它又停止工作了。这真的很奇怪。 -L 标志似乎丢失了..

亲切的问候

罗宾

【问题讨论】:

    标签: cmake build embedded rtems


    【解决方案1】:

    好的,我终于解决了这个问题。上述选项用于明确包含库。在 RTEMS 情况下,只需添加库路径并使用 -qrtems 就足够了。

    可以在此处找到生成的工作 CMakeLists.txt 文件:https://github.com/rmspacefish/rtems-demo/blob/master/applications/stm32/blinky/CMakeLists.txt

    【讨论】:

      猜你喜欢
      • 2018-08-15
      • 2017-05-06
      • 2016-06-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多