0

我正在尝试以现代方式在 CMake 中导入库,如此线程中所示: 如何在 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 标志似乎丢失了..

亲切的问候

罗宾

4

1 回答 1

2

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

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

于 2020-12-09T21:37:10.393 回答