1

我正在尝试在 CMake 中复制以下行为,需要一点帮助...

我正在使用 gcc 编译,然后使用 ld 显式链接。原始 makefile 执行以下操作:

arm-linux-gcc -MD -Wa,-mcpu=arm7tdmi -Dgcc -c init.S
arm-linux-gcc -MD -Wall -fno-common -fshort-enums -mcpu=arm7tdmi -fno-builtin -mapcs -O2 -c serial.c
arm-linux-gcc -MD -Wall -fno-common -fshort-enums -mcpu=arm7tdmi -fno-builtin -mapcs -O2 -c timer.c
arm-linux-gcc -MD -Wall -fno-common -fshort-enums -mcpu=arm7tdmi -fno-builtin -mapcs -O2 -c amd.c
arm-linux-gcc -MD -Wall -fno-common -fshort-enums -mcpu=arm7tdmi -fno-builtin -mapcs -O2 -c intel.c
arm-linux-gcc -MD -Wall -fno-common -fshort-enums -mcpu=arm7tdmi -fno-builtin -mapcs -O2 -c at25f1024.c
arm-linux-gcc -MD -Wall -fno-common -fshort-enums -mcpu=arm7tdmi -fno-builtin -mapcs -O2 -c sst25vf020.c
arm-linux-gcc -MD -Wall -fno-common -fshort-enums -mcpu=arm7tdmi -fno-builtin -mapcs -O2 -c main.c
arm-linux-ld -q --defsym ROBASE=0x00000000 -T init.lds -o init.elf init.o serial.o timer.o amd.o intel.o at25f1024.o sst25vf020.o main.o 

我的 CMakefileLists.txt 看起来像这样

cmake_minimum_required(VERSION 2.8)

project(bootStage2)

#add_definitions(ROBASE 



set(CMAKE_C_FLAGS "-MD -Wall -fno-common -fshort-enums -mcpu=arm7tdmi -fno-builtin -mapcs -O2 -Wl,-q -Wl,--defsym=ROBASE=0x00000000 -T ${bootStage2_SOURCE_DIR}/init.lds")

#add_definitions(ROBASE=0x00000000)

set(SRCFILES  
        serial.c
        timer.c
        amd.c
        intel.c
        at25f1024.c
        sst25vf020.c
        main.c
    )

set(CMAKE_init.elf_LINK_EXECUTABLE "/usr/bob/arm920t/usr/bin/arm-linux-ld")

add_executable( init.elf ${SRCFILES})

SET_TARGET_PROPERTIES(init.elf PROPERTIES LINKER_LANGUAGE C)

add_dependencies( init.elf
                  assemble_S
)

add_custom_target(assemble_S
                  COMMAND /usr/bob/arm920t/usr/bin/arm-linux-gcc -MD -Wa,-mcpu=arm7tdmi -Dgcc -c init.S
                  COMMENT "Assembling init.S"
                  WORKING_DIRECTORY ${bootStage2_SOURCE_DIR}

如果我没有定义链接器 exe,那么 CMake 会尝试使用 gcc 来链接和分段链接错误。

当我告诉它使用 arm-linux-ld 时,cmake 输出抱怨没有要链接的文件,我敢肯定有更好的方法来做到这一点,有人有任何有用的提示吗?

干杯,

克里斯。

4

1 回答 1

1

几年前我们遇到这个问题时发现的方法如下:

我们替换了 cmake 中的链接模板(我们使用了自己的链接器,但它也应该只添加参数):

set(CMAKE_CXX_LINK_EXECUTABLE "${LINKER} ... <LINK_FLAGS> <OBJECTS> <LINK_LIBRARIES>")
set(CMAKE_C_LINK_EXECUTABLE ${CMAKE_CXX_LINK_EXECUTABLE})

... 我省略了我们的自定义参数。这里的关键是<>cmake 为每个要链接的目标填充的元素。

另请参见此处

于 2013-01-29T13:01:17.293 回答