gpt4 book ai didi

console - 使用多个文件制作文件和 SDL

转载 作者:行者123 更新时间:2023-12-04 04:50:21 25 4
gpt4 key购买 nike

我的项目是在 Linux 中使用 SDL 制作一个带有一些移动 Sprite 的简单小屏幕,但我不想使用 IDE。我的目标是更好地了解 makefile 和所有这些业务;然而,我遇到了一堵我似乎无法逾越的墙。我希望有人能解释为什么我有错以及我能做些什么来避免它!

所以,我的程序有多个依赖项,这些依赖项通过每个文件级联 - 因此我在 makefile 中列出了所有需要的依赖项。这是我的代码...

OUT=program
CC=g++
SDL=-lSDLmain -lSDL -lSDL_image -lSDL_ttf

all: constants globals functions sprite sprite_test
${CC} sprite_driver.o sprite.o functions.o globals.o constants.h -o ${OUT} ${SDL}

constants:
${CC} -c constants.h

globals: constants
${CC} -c globals.cpp globals.h constants.h ${SDL}

functions: constants globals
${CC} -c functions.cpp globals.h globals.o constants.h ${SDL}

sprite: constants globals functions
${CC} -c sprite.cpp functions.o globals.o constants.h ${SDL}

sprite_test: constants globals functions sprite
${CC} -c sprite_driver.cpp sprite.o functions.o globals.o constants.h ${SDL}

当编译器到达函数时,它说 globals.o 没有正确链接。在此文件中,有许多在编译后期无法识别的外部声明,因此看起来有多个相同变量的声明。这是控制台吐出的内容。
g++ -c constants.h
g++ -c globals.cpp globals.h constants.h -lSDLmain -lSDL -lSDL_image -lSDL_ttf
g++ -c functions.cpp globals.h globals.o constants.h -lSDLmain -lSDL -lSDL_image -lSDL_ttf
g++: warning: globals.o: linker input file unused because linking not done
g++ -c sprite.cpp functions.o globals.o constants.h -lSDLmain -lSDL -lSDL_image -lSDL_ttf
g++: warning: functions.o: linker input file unused because linking not done
g++: warning: globals.o: linker input file unused because linking not done
g++ -c sprite_driver.cpp sprite.o functions.o globals.o constants.h -lSDLmain -lSDL -lSDL_image -lSDL_ttf
g++: warning: sprite.o: linker input file unused because linking not done
g++: warning: functions.o: linker input file unused because linking not done
g++: warning: globals.o: linker input file unused because linking not done
g++ sprite_driver.o sprite.o functions.o globals.o constants.h -o program -lSDLmain -lSDL -lSDL_image -lSDL_ttf
sprite.o:(.bss+0x0): multiple definition of `screen'
sprite_driver.o:(.bss+0x0): first defined here
sprite.o:(.bss+0x4): multiple definition of `event'
sprite_driver.o:(.bss+0x4): first defined here
sprite.o:(.bss+0x18): multiple definition of `keystate'
sprite_driver.o:(.bss+0x18): first defined here
sprite.o:(.bss+0x1c): multiple definition of `font'
sprite_driver.o:(.bss+0x1c): first defined here
sprite.o:(.bss+0x20): multiple definition of `t_black'
sprite_driver.o:(.bss+0x20): first defined here
functions.o:(.bss+0x0): multiple definition of `screen'
sprite_driver.o:(.bss+0x0): first defined here
functions.o:(.bss+0x4): multiple definition of `event'
sprite_driver.o:(.bss+0x4): first defined here
functions.o:(.bss+0x18): multiple definition of `keystate'
sprite_driver.o:(.bss+0x18): first defined here
functions.o:(.bss+0x1c): multiple definition of `font'
sprite_driver.o:(.bss+0x1c): first defined here
functions.o:(.bss+0x20): multiple definition of `t_black'
sprite_driver.o:(.bss+0x20): first defined here
collect2: error: ld returned 1 exit status
make: *** [all] Error 1

最佳答案

你在这里犯了很多错误,我认为你可能需要获得一些介绍性 Material 并通读它们。 SO 并不是从头开始学习这些工具的正确地方:有很多资源可以做到这一点。

一些事情:

  • 你不编译.h (头)文件。
  • 编译 .c 时,不要在编译或链接命令行上列出头文件。 (源)文件。
  • 您没有列出.o (object) files 当您将源文件编译为目标文件时,在 compile 命令行上。您只将目标文件放在链接命令行上。
  • 您没有列出-l... (library) 文件,当您将源文件编译为目标文件时,在编译命令行上。您只需将库文件放在链接命令行上。
  • 您的 makefile 规则必须使用您尝试创建的实际文件作为目标,而不仅仅是您选择的单词。
  • 按照长期惯例,CC makefile 中的变量代表 C 编译器。您正在尝试编译 C++ 源代码,因此您应该使用 CXX变量。

  • make 程序有很多关于如何构建各种文件的内置规则,其中之一描述了如何从 .cpp 构建目标文件。 (C++ 源代码)文件。利用这一点,您可以非常简单地将 makefile 编写为:
    OUT = program
    CXX = g++
    SDL = -lSDLmain -lSDL -lSDL_image -lSDL_ttf

    OBJECTS = sprite_driver.o sprite.o functions.o globals.o

    all: $(OUT)
    $(OUT): $(OBJECTS)
    $(CXX) -o $@ $^ ${SDL}

    $(OBJECTS): constants.h

    关于console - 使用多个文件制作文件和 SDL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17517918/

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