Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Makefile对每个对象文件使用相同的源_Linux_Makefile - Fatal编程技术网

Linux Makefile对每个对象文件使用相同的源

Linux Makefile对每个对象文件使用相同的源,linux,makefile,Linux,Makefile,我有一个makefile,它应该将大量源文件编译成单独的对象文件,然后将它们链接到一个共享库中 源文件列表存储在变量SOURCES中。在编译对象文件的$(OBJECTS)目标期间,make运行命令$(CC)$(CFLAGS)-c$

我有一个makefile,它应该将大量源文件编译成单独的对象文件,然后将它们链接到一个共享库中

源文件列表存储在变量SOURCES中。在编译对象文件的$(OBJECTS)目标期间,make运行命令$(CC)$(CFLAGS)-c$<-o$@,其中$<是$(addprefix$(SRCPATH),$(SOURCES))

这使得命令对每个对象文件使用相同的源文件,给我一组从Time.cpp生成的对象文件,并导致链接器给我一组已经在每个其他对象文件中定义的函数错误。我怎样才能使这个makefile工作

# Variable setup
# BUILD - Either Debug or Release, specify when running make
# ARCH - Either 32 or 64, specify when running make
# CC - The compiler
# INC - The include directories
# CFLAGS - Compiler flags to use
# LDFLAGS - Linker flags to use
# OBJDIR - Directory for .o files
# BINARY - Output file path
# SOURCES - Path to each individual source file
# OBJECTS - Object files

ifeq ($(and $(ARCH),$(BUILD)),)
    $(error You have either not defined an architecture or build or both, please run "make BUILD=(DEBUG/RELEASE) ARCH=(32/64)")
endif

CC  = g++
INC = -I../../include -I../../extlibs/headers -I../../extlibs/headers/libfreetype/linux
LDFLAGS = -lX11 -lGL -lGLEW -lfreetype -ljpeg -lopenal -lsndfile
CFLAGS  = $(INC) -std=c++0x -fPIC -pthread -m$(ARCH)
OBJDIR  = ./obj/$(BUILD)/$(ARCH)-bit
BINPATH = ./bin/$(BUILD)/$(ARCH)-bit
BINARY  = $(BINPATH)/libTyrant$(ARCH).so
SRCPATH = ../../src/
SOURCES = System/Time.cpp System/Mutex.cpp System/Log.cpp System/Clock.cpp System/Sleep.cpp System/Unix/ClockImpl.cpp System/Unix/MutexImpl.cpp System/Unix/SleepImpl.cpp System/Unix/ThreadImpl.cpp System/Unix/ThreadLocalImpl.cpp System/Lock.cpp System/String.cpp System/ThreadLocal.cpp System/Thread.cpp Audio/SoundRecorder.cpp Audio/SoundBuffer.cpp Audio/SoundSource.cpp Audio/AudioDevice.cpp Audio/ALCheck.cpp Audio/Sound.cpp Audio/Music.cpp Audio/SoundFile.cpp Audio/SoundStream.cpp Audio/SoundBufferRecorder.cpp Audio/Listener.cpp Graphics/RectangleShape.cpp Graphics/VertexArray.cpp Graphics/Shader.cpp Graphics/ConvexShape.cpp Graphics/ImageLoader.cpp Graphics/Sprite.cpp Graphics/RenderTexture.cpp Graphics/BlendMode.cpp Graphics/Shape.cpp Graphics/CircleShape.cpp Graphics/TextureSaver.cpp Graphics/Vertex.cpp Graphics/RenderTextureImpl.cpp Graphics/Texture.cpp Graphics/Text.cpp Graphics/GLExtensions.cpp Graphics/Image.cpp Graphics/RenderTextureImplFBO.cpp Graphics/GLCheck.cpp Graphics/RenderTextureImplDefault.cpp Graphics/Color.cpp Graphics/Transformable.cpp Graphics/RenderTarget.cpp Graphics/Transform.cpp Graphics/View.cpp Graphics/RenderStates.cpp Graphics/RenderWindow.cpp Graphics/Font.cpp Window/JoystickManager.cpp Window/Joystick.cpp Window/Window.cpp Window/Keyboard.cpp Window/GlResource.cpp Window/Unix/JoystickImpl.cpp Window/Unix/WindowImplX11.cpp Window/Unix/GlxContext.cpp Window/Unix/Display.cpp Window/Unix/VideoModeImpl.cpp Window/Unix/InputImpl.cpp Window/VideoMode.cpp Window/Mouse.cpp Window/GlContext.cpp Window/Context.cpp Window/WindowImpl.cpp Network/Ftp.cpp Network/TcpListener.cpp Network/Packet.cpp Network/IpAddress.cpp Network/TcpSocket.cpp Network/Socket.cpp Network/Unix/SocketImpl.cpp Network/UdpSocket.cpp Network/SocketSelector.cpp Network/Http.cpp
OBJECTS = $(addprefix $(OBJDIR)/,$(SOURCES:.cpp=.o))

ifeq ($(BUILD),DEBUG)
    CFLAGS := $(CFLAGS) -g -pg -Og
endif

ifeq ($(BUILD),RELEASE)
    CFLAGS := $(CFLAGS) -s -O3
endif

all: clean $(addprefix $(SRCPATH),$(SOURCES)) $(BINARY)

$(BINARY): $(OBJECTS) $(BINPATH)
    $(CC) $(LDFLAGS) $(OBJECTS) -shared -o $@

$(OBJECTS): $(addprefix $(SRCPATH),$(SOURCES)) $(OBJDIR)
    $(CC) $(CFLAGS) -c $< -o $@

$(OBJDIR):
    mkdir ./obj
    mkdir ./obj/$(BUILD)
    mkdir $@
    mkdir $@/Audio
    mkdir $@/Graphics
    mkdir $@/Network
    mkdir $@/Network/Unix
    mkdir $@/System
    mkdir $@/System/Unix
    mkdir $@/Window
    mkdir $@/Window/Unix

$(BINPATH):
    mkdir ./bin
    mkdir ./bin/$(BUILD)
    mkdir $@

clean:
    rm -rf bin
    rm -rf obj
#变量设置
#构建-调试或发布,在运行make时指定
#ARCH-32或64,在运行make时指定
#CC-编译器
#INC-包含目录
#CFLAGS-要使用的编译器标志
#LDFLAGS-要使用的链接器标志
#OBJDIR-用于.o文件的目录
#二进制输出文件路径
#SOURCES—每个源文件的路径
#对象-对象文件
ifeq($(和$(ARCH),$(BUILD)),)
$(错误:您没有定义体系结构或生成,或两者都没有定义,请运行“make build=(DEBUG/RELEASE)ARCH=(32/64)”
恩迪夫
CC=g++
INC=-I.././include-I.././extlibs/headers-I.././extlibs/headers/libfreetype/linux
LDFLAGS=-lX11-lGL-lGLEW-lfreetype-ljpeg-lopenal-lsndfile
CFLAGS=$(INC)-std=c++0x-fPIC-pthread-m$(ARCH)
OBJDIR=./obj/$(构建)/$(拱形)-位
bin路径=./bin/$(构建)/$(拱形)-位
BINARY=$(BINPATH)/libTyrant$(ARCH)
SRCPATH=../src/
来源=System/Time.cpp System/Mutex.cpp System/Log.cpp System/Clock.cpp System/Sleep.cpp System/Unix/ClockImpl.cpp System/Unix/MutexImpl.cpp System/Unix/sleempl.cpp System/Unix/ThreadImpl.cpp System/Lock.cpp System/String.cpp System/ThreadLocal.cpp System/Thread.cpp Audio/SoundRecorder.cpp Audio/SoundBuffer.cppAudio/SoundSource.cpp Audio/AudioDevice.cpp Audio/ALCheck.cpp Audio/Sound.cpp Audio/Music.cpp Audio/SoundStream.cpp Audio/SoundBufferRecorder.cpp Audio/Listener.cpp Graphics/RectangleShape.cpp Graphics/VertexArray.cpp Graphics/Shader.cpp Graphics/shapper/ImageLoader.cpp Graphics/Sprite.cppGraphics/RenderTexture.cpp Graphics/BlendMode.cpp Graphics/Shape.cpp Graphics/CircleShape.cpp Graphics/TextureSave.cpp Graphics/Vertex.cpp Graphics/RenderTextureImpl.cpp Graphics/Text.cpp Graphics/GLExtensions.cpp Graphics/Image.cpp Graphics/RenderTextureImplFBO.cpp Graphics/GLCheck.cpp Graphics/RenderTextureImplDefault.cppGraphics/Color.cpp Graphics/Transformable.cpp Graphics/RenderTarget.cpp Graphics/Transform.cpp Graphics/RenderStates.cpp Graphics/RenderWindow.cpp Graphics/Font.cpp Window/JoystickManager.cpp Window/joycook.cpp Window/Keyboard.cpp Window/GlResource.cpp Window/Unix/JoystickImpl.cpp Window/Unix/WindowImplX11.cppWindow/Unix/GlxContext.cpp Window/Unix/Display.cpp Window/Unix/VideoModeImpl.cpp Window/Unix/inputinpl.cpp Window/VideoMode.cpp Window/Mouse.cpp Window/GlContext.cpp Window/WindowImpl.cpp Network/Ftp.cpp Network/TcpListener.cpp Network/Packet.cpp Network/IpAddress.cpp Network/TcpSocket.cpp Network/Socket.cppNetwork/Unix/SocketImpl.cpp Network/UdpSocket.cpp Network/SocketSelector.cpp Network/Http.cpp
对象=$(addprefix$(OBJDIR)/,$(源:.cpp=.o))
ifeq($(构建),调试)
CFLAGS:=$(CFLAGS)-g-pg-Og
恩迪夫
ifeq($(构建),发布)
CFLAGS:=$(CFLAGS)-s-O3
恩迪夫
全部:清除$(addprefix$(SRCPATH),$(源))$(二进制)
$(二进制):$(对象)$(BINPATH)
$(CC)$(LDFLAGS)$(对象)-共享-o$@
$(对象):$(addprefix$(SRCPATH),$(SOURCES))$(OBJDIR)
$(CC)$(CFLAGS)-c$<-o$@
$(OBJDIR):
mkdir./obj
mkdir./obj/$(构建)
mkdir$@
mkdir$@/音频
mkdir$@/图形
mkdir$@/网络
mkdir$@/Network/Unix
mkdir$@/系统
mkdir$@/System/Unix
mkdir$@/窗口
mkdir$@/Window/Unix
$(BINPATH):
mkdir./bin
mkdir./bin/$(构建)
mkdir$@
清洁:
rm-rf箱
rm-rf obj

这里有几个问题

假设所有源文件都在工作目录中,而目标文件也属于该目录。您可以单独构建每个对象,使用模式规则覆盖所有对象,而不是尝试使用一个命令构建所有对象:

%.o: %.cpp
    $(CC) $(CFLAGS) -c $< -o $@
(一旦你做到了这一点,你可能会记得Make已经有了内置的规则,比如从
foo.cpp
构建
foo.o
,但现在不要介意了。)

但在构建方案中,这与其他问题相结合:1)源文件位于多个不同的目录中,2)希望在其他位置构建对象,即3)在镜像源树的目录树中,4)动态构建


解决所有这些问题将是一个相当复杂的答案。您对其中哪一项已经感到满意了?

您在这里遇到了几个问题

假设所有源文件都在工作目录中,而目标文件也属于该目录。您可以单独构建每个对象,使用模式规则覆盖所有对象,而不是尝试使用一个命令构建所有对象:

%.o: %.cpp
    $(CC) $(CFLAGS) -c $< -o $@
(一旦你做到了这一点,你可能会记得Make已经有了内置的规则,比如从
foo.cpp
构建
foo.o
,但现在不要介意了。)

但在构建方案中,这与其他问题相结合:1)源文件位于多个不同的目录中,2)希望在其他位置构建对象,即3)在镜像源树的目录树中,4)动态构建


解决所有这些问题将是一个相当复杂的答案。您对其中哪一项已经感到满意了?

您在这里遇到了几个问题

假设
$(BINARY): $(SOURCES) $(BINPATH)
    $(CC) $(LDFLAGS) $(OBJECTS) -shared -o $@

$(SOURCES): $(OBJDIR)
    $(CC) $(CFLAGS) -c $(SRCPATH)$@ -o $(patsubst %.cpp,%.o,$(OBJDIR)/$@)