我正在尝试以现代方式在 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 标志似乎丢失了..
亲切的问候
罗宾