我正在尝试以现代的方式在CMake中导入一个库,如下面的线程所示:How do I add a library path in cmake?
我们的目标是构建一个RTEMS测试程序。我在Ubuntu 20.04机器上构建,并且正在交叉编译ARM目标和arm/stm32h7 BSP。
这些库位于外部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。THe命令现在如下所示:
/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 UPDATE2:
我解决了这个问题。仍然有一个小的语法错误,我想引号丢失了。设置库属性的命令现在如下所示:
set_target_properties(${RTEMS_LIB_NAME} PROPERTIES
IMPORTED_LOCATION "${RTEMS_BSP_LIB_PATH}"
INTERFACE_INCLUDE_DIRECTORIES "${RTEMS_BSP_INC_PATH}"
)并且二进制文件链接正确:-)
UPDATE3:
而且它又停止工作了。这真的很奇怪。-L标志似乎缺少..
亲切的问候
罗宾
发布于 2020-12-10 05:37:10
好了,我终于解决这个问题了。上面的选项用于显式地包含库。对于RTEMS,只需添加库路径并使用-qrtems就足够了。
可以在以下位置找到结果和工作的CMakeLists.txt文件:https://github.com/rmspacefish/rtems-demo/blob/master/applications/stm32/blinky/CMakeLists.txt
https://stackoverflow.com/questions/65220837
复制相似问题