2017-03-23 5 views
1

Ich versuche, ein Bare-Metal-Programm mit CMake (mein Projekt findet in https://github.com/oska874/cmake_test ist) zu schreiben. Die Demo-Quellcode sind diese:Wie verwende ich spezielles Link-Skript (* .lds) mit CMake?

my.c

void mymain(void) 
{ 
    int a=0; 
    a++; 
    a++; 
} 

und Link-Skriptdatei ist:

my.lds

ENTRY(mymain) 
SECTIONS 
{ 
    . = 0x10000; 
    .text : { *(.text) } 
    . = 0x8000000; 
    .data : { *(.data) } 
    .bss : { *(.bss) } 
} 

ich es mit dem Befehl unten zusammenstellen können:

gcc -c my.c 
ld -T my.lds -o my my.o 

Aber ich weiß nicht, wie man das gleiche mit CMake macht, denn CMake benutzt immer sein eigenes .lds Skript.

Ich habe versucht, Google-Suche und Stackoverflow, aber alle Verfahren fehlgeschlagen.

/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 

I CMakeLists.txt als Gebrüll versucht:

PROJECT(FreeRtos) 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 

set(CMAKE_EXE_LINKER_FLAGS_DEBUG " -T ${CMAKE_SOURCE_DIR}/my.lds -static") 

AUX_SOURCE_DIRECTORY(. MYSRC) 
ADD_EXECUTABLE(my ${MYSRC}) 

set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE) 

Und das

CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) 
PROJECT(LINKERSCRIPT C) 
# dummy.c must exist: 
ADD_EXECUTABLE(EXE my.c dummy.c) 
# linkerscript must exist: 
SET_SOURCE_FILES_PROPERTIES(
     dummy.c PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/my.lds 
     ) 

überprüfte ich die link.txt in CMakeFiles/EXE.dir/, zeigt es, dass:

/usr/bin/cc -g  -T /os_dev/workspace/test/ezio/tool/eo/freertos-pine64/Source/t2/my.lds -static CMakeFiles/my.dir/my.c.o -o my -rdynamic 

Ich versuchte cc mit ld mit dem Befehl zum Austausch dass:

SET(CMAKE_C_LINK_EXECUTABLE "/usr/bin/ld <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET>") 

Es funktioniert, zeigt die link.txt CMake my.lds verwenden.

+0

Nur '-T my.lds' als ** Linker-Flags **, wie hier beschrieben: http://stackoverflow.com/questions/6077414/cmake-how-to-set-the-ldflags-in- cmakelists-txt. – Tsyvarev

+0

@Tsyvarev Alreday versucht, aber hat keine Wirkung. – Ezio

+0

Dann zeigen Sie den Code ('CMakeLists.txt'), den Sie versucht haben. – Tsyvarev

Antwort

2

CMake hat keine spezielle Variable für ldscript, so können Sie greifen zu anhängt geeigneten Linker-Flags:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ${CMAKE_SOURCE_DIR}/my.lds") 

(Dies sollte nachproject() Anruf in CMakeLists.txt platziert werden).

Siehe that question für weitere Informationen über Linker-Flags in CMake Einstellung. geben