C++ 我得到一个;尝试动态对象`/usr/lib/x86_64-linux-gnu/libc++;abi.a'&引用;尝试静态链接libc+;时出错+;阿比 环境 ubuntu 18.04(由vagrant创建的虚拟环境) gcc5.5.0

C++ 我得到一个;尝试动态对象`/usr/lib/x86_64-linux-gnu/libc++;abi.a'&引用;尝试静态链接libc+;时出错+;阿比 环境 ubuntu 18.04(由vagrant创建的虚拟环境) gcc5.5.0,c++,ubuntu,makefile,g++,ld,C++,Ubuntu,Makefile,G++,Ld,我正在尝试构建自己的小操作系统。 我正在用C++/NASM编写内核 我将编译组成内核的几个C++文件,然后将它们链接在一起,创建一个可执行文件。(这是因为我自己内核的入口点不是“main”,所以我不敢在编译的同时链接) 错误 < >每个C++文件的编译都会运行,没有任何问题,每个对象文件都会被创建。 但是,在链接对象文件时出现以下错误 但我知道“.a”文件是一个静态对象,而不是动态对象,所以我无法理解为什么会出现这个错误 如果你能告诉我,我将不胜感激 ld: attempted static l

我正在尝试构建自己的小操作系统。 我正在用C++/NASM编写内核

我将编译组成内核的几个C++文件,然后将它们链接在一起,创建一个可执行文件。(这是因为我自己内核的入口点不是“main”,所以我不敢在编译的同时链接)

错误 < >每个C++文件的编译都会运行,没有任何问题,每个对象文件都会被创建。 但是,在链接对象文件时出现以下错误

但我知道“.a”文件是一个静态对象,而不是动态对象,所以我无法理解为什么会出现这个错误

如果你能告诉我,我将不胜感激

ld: attempted static link of dynamic object `/usr/lib/x86_64-linux-gnu/libc++abi.a'
这是日志的全文

mkdir -p ./obj
g++ -O2 -g -MMD -Wall -I./include -o obj/hoge.o -c src/hoge.cpp
mkdir -p ./obj
g++ -O2 -g -MMD -Wall -I./include -o obj/huga.o -c src/huga.cpp
mkdir -p ./obj
g++ -O2 -g -MMD -Wall -I./include -o obj/piyo.o -c src/piyo.cpp
mkdir -p ./obj
nasm -f elf64 -o obj/assm.o src/assm.asm
ld --entry <ENTRY_POINT> --static -o ./ELF/kernel.elf ./obj/hoge.o ./obj/huga.o ./obj/piyo.o ./obj/assm.o -lc -lc++ -lc++abi -L/usr/lib/x86_64-linux-gnu
ld: attempted static link of dynamic object `/usr/lib/x86_64-linux-gnu/libc++abi.a'
Makefile:12: recipe for target 'ELF/kernel.elf' failed
make: *** [ELF/kernel.elf] Error 1
mkdir-p./obj
g++-O2-g-MMD-Wall-I./include-obj/hoge.o-csrc/hoge.cpp
mkdir-p./obj
g++-O2-g-MMD-Wall-I./include-obj/huga.o-csrc/huga.cpp
mkdir-p./obj
g++-O2-g-MMD-Wall-I./include-obj/piyo.o-csrc/piyo.cpp
mkdir-p./obj
nasm-f elf64-o obj/assm.o src/assm.asm
ld--entry--static-o./ELF/kernel.ELF./obj/hoge.o./obj/huga.o./obj/piyo.o./obj/assm.o-lc-lc-lc++-lc++-abi-L/usr/lib/x86_64-linux-gnu
ld:尝试动态对象“/usr/lib/x86_64-linux-gnu/libc++abi.a”的静态链接
Makefile:12:目标'ELF/kernel.ELF'的配方失败
make:**[ELF/kernel.ELF]错误1
生成文件
COMPILER=g++
CFLAGS=-O2-g-MMD-壁厚
INCLUDE=-I./INCLUDE
TARGET=./ELF/kernel.ELF
SRCDIR=/src
来源:=$(shell find$(SRCDIR)-name*.cpp-或-name*.c-或-name*.asm)
OBJDIR=/obj
OBJECTS=$(OBJDIR)/hoge.o$(OBJDIR)/huga.o$(OBJDIR)/piyo.o$(OBJDIR)/assm.o
依赖项=$(对象:.o=.d)
LDFLAGS=--entry--static
$(目标):$(对象)
ld$(LDFLAGS)-o$(TARGET)$(OBJECTS)-lc-lc++-lc++-abi-L/usr/lib/x86_64-linux-gnu
$(OBJDIR)/%.o:$(SRCDIR)/%.cpp
-mkdir-p$(OBJDIR)
$(编译器)$(CFLAGS)$(包括)-o$@-c$<
$(OBJDIR)/%.o:$(SRCDIR)/%.asm
-mkdir-p$(OBJDIR)
nasm-f elf64-o$@$<
全部:清洁美元(目标)
清洁:
rm-rf$(对象)$(依赖)$(目标)
-包括美元(视情况而定)

对于您自己的内核,您不能真正使用普通的标准库(C或C++),因为它们的大部分功能都依赖于操作系统支持,而操作系统支持在内核中是不存在的。谢谢您的评论。我试图使用标准的libc或libc++。这是一个错误。如果我链接为其他原始操作系统构建的libc和libc++二进制文件,则错误消息已更改。这和标题错误不一样,但在问题解决之前,我将离开这篇文章。非常感谢你!对于您自己的内核,您不能真正使用普通的标准库(C或C++),因为它们的大部分功能都依赖于操作系统支持,而操作系统支持在内核中是不存在的。谢谢您的评论。我试图使用标准的libc或libc++。这是一个错误。如果我链接为其他原始操作系统构建的libc和libc++二进制文件,则错误消息已更改。这和标题错误不一样,但在问题解决之前,我将离开这篇文章。非常感谢你!
COMPILER  = g++
CFLAGS    = -O2 -g -MMD -Wall
INCLUDE   = -I./include
TARGET    = ./ELF/kernel.elf
SRCDIR    = ./src
SOURCES := $(shell find $(SRCDIR) -name *.cpp -or -name *.c -or -name *.asm)
OBJDIR    = ./obj
OBJECTS   = $(OBJDIR)/hoge.o $(OBJDIR)/huga.o $(OBJDIR)/piyo.o $(OBJDIR)/assm.o
DEPENDS   = $(OBJECTS:.o=.d)
LDFLAGS = --entry <ENTRY_POINT> --static
$(TARGET): $(OBJECTS)
    ld $(LDFLAGS) -o $(TARGET) $(OBJECTS) -lc -lc++ -lc++abi -L/usr/lib/x86_64-linux-gnu

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
    -mkdir -p $(OBJDIR)
    $(COMPILER) $(CFLAGS) $(INCLUDE) -o $@ -c $<

$(OBJDIR)/%.o: $(SRCDIR)/%.asm
    -mkdir -p $(OBJDIR)
    nasm -f elf64 -o $@ $<

all: clean $(TARGET)

clean:
    rm -rf $(OBJECTS) $(DEPENDS) $(TARGET)

-include $(DEPENDS)