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.
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
@Tsyvarev Alreday versucht, aber hat keine Wirkung. – Ezio
Dann zeigen Sie den Code ('CMakeLists.txt'), den Sie versucht haben. – Tsyvarev