gpt4 book ai didi

cmake:外部(生成的)和编译对象以及库的链接顺序

转载 作者:行者123 更新时间:2023-12-02 09:49:04 26 4
gpt4 key购买 nike

我正在使用裸机 x86,但在将我的构建从直接 makefile 移植到 cmake 时遇到了障碍。

在我的 makefile 中,我的对象定义如下:

LINK_LIST=\
$(LDFLAGS) \
$(ARCHDIR)/crti.o \
$(ARCHDIR)/crtbegin.o \
$(KERNEL_OBJS) \
$(LIBS) \
$(ARCHDIR)/crtend.o \
$(ARCHDIR)/crtn.o \

crtbegin.o 和 crtend.o 是“生成的”,即由我的交叉编译器提供(-print-file-name 标志)。 $(LIBS) 是 -l 标志,如 -lgcc 等。由于它直接传递给链接器,因此顺序是指定的。

我的cmake目标定义如下:

ADD_EXECUTABLE(loader 
"${INIT_SRC}"
"${INIT_OBJ}"
"${PLATFORM_SRCS}"
"${ISA_SRCS}"
"${GENERIC_SRCS}"
"${FINI_OBJ}"
"${FINI_SRC}")

INIT_OBJ 和 FINI_OBJ 在源文件属性中将 EXTERNAL_OBJECT 和 GENERATED 设置为 true。运行生成的 makefile 时查看命令行,我发现所有源文件都按指定的顺序排列,但 init 和 fini 对象位于列表的最后。

这是生成的命令行(为简洁起见进行了编辑):

i686-elf-gcc -nostdlib -ffreestand -nostdinc -T linker.ld -lgcc crti.s.obj boot.s.obj loader.c.obj crtn.s.obj crtbegin.o crtend.o -o 加载程序

-lgcc 标志在我的 LINK_FLAGS 中是明确的,这也是我想要更改的内容。

所以我对此有几个问题:

  1. 为什么 cmake 不使用两个外部目标文件的顺序,而是将其用于编译后的文件?

  2. 我如何告诉 cmake 将这些对象与来 self 的源的对象一样对待?

  3. 如何获得 Makefile 中设置的完整克隆(在目标文件之间包含库标志)

我也检查了 CMAKE_C_LINK_EXECUTABLE,但它似乎没有足够的粒度/控制链接器参数来实现这一点。

我在 ubuntu 上使用 cmake 3.10.2。

还有另一个关于 cmake 的(题外话)问题:

它不将 .S 视为标准程序集文件扩展名。我尝试使用 LIST(APPEND CMAKE_ASM-ATT_SOURCE_FILE_EXTENSIONS S) 添加它,它确实添加得很好,但是文件仍然没有被编译,除非我将其更改为 .s。还有其他人遇到过这个问题吗?

谢谢!

最佳答案

对象 crtbegin.ocrtend.o对链接命令中的位置有特定要求的 ,可以被视为工具链的一部分。如果您决定这样做,那么您可以设置变量 CMAKE_C_LINK_EXECUTABLE反射(reflect)这一点:

SET(ARCHDIR "<...>")
# Object 'crtbegin.o' will be linked before all other objects and libraries.
# Object 'crtend.o' will be linked after all other objects and libraries.
SET(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS>
<LINK_FLAGS>
${ARCHDIR}/crtbegin.o
<OBJECTS> -o <TARGET> <LINK_LIBRARIES>
${ARCHDIR}/crtend.o")

此设置应在工具链文件中完成,该文件被传递到 cmake带选项-DCMAKE_TOOLCHAIN=<path/to/toolchain/file> .

有了这样的工具链,在 CMakeLists.txt你可以简单地写

ADD_EXECUTABLE(loader ${PLATFORM_SRCS} ${ISA_SRCS} ${GENERIC_SRCS})
<小时/>

使用CMAKE_C_LINK_EXECUTABLE您还可以放置诸如

之类的变量
-nostdlib -ffreestanding -nostdinc -T linker.ld -lgcc

这也与工具链非常相关。

另请参阅此邮件:https://cmake.org/pipermail/cmake/2010-June/037641.html .

关于cmake:外部(生成的)和编译对象以及库的链接顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56534658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com