首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CMake中导入(RTEMS )库

在CMake中导入(RTEMS )库
EN

Stack Overflow用户
提问于 2020-12-10 00:28:38
回答 1查看 90关注 0票数 0

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

我们的目标是构建一个RTEMS测试程序。我在Ubuntu 20.04机器上构建,并且正在交叉编译ARM目标和arm/stm32h7 BSP。

这些库位于外部lib文件夹中。我几乎完成了构建过程,但是CMake似乎做了一些破坏链接过程的事情。我可能犯了这个错误,但我在找出它时遇到了问题。

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

代码语言:javascript
复制
...
# 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尝试的原始链接命令如下所示:

代码语言:javascript
复制
/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 

然后我得到了错误:

代码语言:javascript
复制
./../../../arm-rtems6/bin/ld: cannot open linker script file linkcmds: No such file or directory

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

代码语言:javascript
复制
/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命令现在如下所示:

代码语言:javascript
复制
/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:

我解决了这个问题。仍然有一个小的语法错误,我想引号丢失了。设置库属性的命令现在如下所示:

代码语言:javascript
复制
set_target_properties(${RTEMS_LIB_NAME} PROPERTIES
    IMPORTED_LOCATION "${RTEMS_BSP_LIB_PATH}"
    INTERFACE_INCLUDE_DIRECTORIES "${RTEMS_BSP_INC_PATH}"
)

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

UPDATE3:

而且它又停止工作了。这真的很奇怪。-L标志似乎缺少..

亲切的问候

罗宾

EN

回答 1

Stack Overflow用户

发布于 2020-12-10 05:37:10

好了,我终于解决这个问题了。上面的选项用于显式地包含库。对于RTEMS,只需添加库路径并使用-qrtems就足够了。

可以在以下位置找到结果和工作的CMakeLists.txt文件:https://github.com/rmspacefish/rtems-demo/blob/master/applications/stm32/blinky/CMakeLists.txt

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65220837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档