如何在 CMake 中使用特定的 link 脚本(*.lds)?
How to use specific link script(*.lds) with CMake?
我正在尝试使用 CMake 编写裸机程序(我的项目位于 https://github.com/oska874/cmake_test)。
演示源代码如下:
my.c
void mymain(void)
{
int a=0;
a++;
a++;
}
和link脚本文件是:
my.lds
ENTRY(mymain)
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
我可以用下面的命令编译它:
gcc -c my.c
ld -T my.lds -o my my.o
但我不知道如何用 CMake 做同样的事情,因为 cmake 总是使用它自己的 .lds 脚本。
我尝试了搜索 google 和 Whosebug,但所有方法都失败了。
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
我试过 CMakeLists.txt 如下:
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)
还有这个
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
)
我检查了CMakeFiles/EXE.dir/
中的link.txt
,它显示:
/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
我尝试用以下命令将 cc 与 ld 交换:
SET(CMAKE_C_LINK_EXECUTABLE "/usr/bin/ld <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET>")
有效,link.txt 显示 CMake 将使用 my.lds。
CMake 没有用于 ldscript 的特殊变量,因此您可以求助于附加适当的 链接器标志:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ${CMAKE_SOURCE_DIR}/my.lds")
(这应该放在之后 project()
调用CMakeLists.txt
)。
有关在 CMake 中设置链接器标志的详细信息,请参阅 that question。
我正在尝试使用 CMake 编写裸机程序(我的项目位于 https://github.com/oska874/cmake_test)。 演示源代码如下:
my.c
void mymain(void)
{
int a=0;
a++;
a++;
}
和link脚本文件是:
my.lds
ENTRY(mymain)
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
我可以用下面的命令编译它:
gcc -c my.c
ld -T my.lds -o my my.o
但我不知道如何用 CMake 做同样的事情,因为 cmake 总是使用它自己的 .lds 脚本。
我尝试了搜索 google 和 Whosebug,但所有方法都失败了。
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
我试过 CMakeLists.txt 如下:
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)
还有这个
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
)
我检查了CMakeFiles/EXE.dir/
中的link.txt
,它显示:
/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
我尝试用以下命令将 cc 与 ld 交换:
SET(CMAKE_C_LINK_EXECUTABLE "/usr/bin/ld <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET>")
有效,link.txt 显示 CMake 将使用 my.lds。
CMake 没有用于 ldscript 的特殊变量,因此您可以求助于附加适当的 链接器标志:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ${CMAKE_SOURCE_DIR}/my.lds")
(这应该放在之后 project()
调用CMakeLists.txt
)。
有关在 CMake 中设置链接器标志的详细信息,请参阅 that question。