1

CMake で次の動作を再現しようとしていますが、少し支援が必要です...

gcc を使用してコンパイルし、ld 明示を使用してリンクしています。元のメイクファイルは次のことを実行します。

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 を使用してリンクを作成し、リンクの障害をセグメント化しようとします。

cmake の出力で、arm-linux-ld を使用するように指示したときに、リンクするファイルがないと不平を言います。これを行うためのより良い方法があると確信しています。誰かに役立つヒントはありますか?

乾杯、

クリス。

4

1 に答える 1

1

数年前にこの問題に直面したときに見つけた方法は次のとおりです。

cmake の link-template を置き換えました (独自のリンカーを使用しましたが、引数を追加するだけでも機能するはずです)。

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 に答える