gpt4 book ai didi

c++ - 在 GCC 上构建的函数多重定义链接器错误 - Makefile 问题

转载 作者:太空狗 更新时间:2023-10-29 23:46:21 24 4
gpt4 key购买 nike

所以我正在尝试使用 Makefile 来构建项目,并且我对 Makefile 通常比较陌生。链接大量函数时出现多个定义错误,我很确定这是由于我的 makefile 造成的。我不能发布项目的大部分内容,因为它非常大,但是 makefile 在下面,有什么明显错误的地方吗?

我在 header 中声明了一些函数 + 定义,并将它们的定义移动到 cpp 中,从链接器错误中删除了这些函数 - 但我不能对所有函数都这样做(编辑:正在乘法的其余函数defined 不在标题中,它们作为标准在 cpp/cc 文件中,说“我不能为所有人都这样做”暗示它们都是那样,抱歉),因为很大一部分是我无法编辑的代码库。代码中不应该有任何错误,因为它在没有我添加的情况下在一个单独的项目中构建得很好(没有一个导致链接器错误),所以我认为它一定是我的 makefile,但我无法弄清楚我做错了什么.有什么想法吗?

    # Compiler
CXX = g++

# Linker settings
LDFLAGS = -lGL -lGLU -lXext -lX11

# Executable name
EXEC = SplotchPreviewer

# Optimizations for compilation
OPTIMIZE = -std=c++98 -pedantic -Wno-long-long -Wfatal-errors -Wextra -Wall -Wstrict-aliasing=2 -Wundef -Wshadow -Wwrite-strings -Wredundant-decls -Woverloaded-virtual -Wcast-qual -Wcast-align -Wpointer-arith -O2 -g


# Pre-processor settings
CPPFLAGS = $(OPTIMIZE) -I. -Icxxsupport -Ic_utils

# Default Splotch objects
OBJS_SPLOTCH_DEFAULT = cxxsupport/error_handling.o reader/mesh_reader.o cxxsupport/mpi_support.o cxxsupport/paramfile.o \
cxxsupport/string_utils.o cxxsupport/announce.o reader/gadget_reader.o reader/millenium_reader.o \
reader/bin_reader.o reader/tipsy_reader.o splotch/splotchutils.o splotch/scenemaker.o \
cxxsupport/walltimer.o c_utils/walltime_c.o booster/mesh_creator.o booster/randomizer.o \
booster/p_selector.o booster/m_rotation.o cxxsupport/paramfile.o cxxsupport/error_handling.o \
c_utils/walltime_c.o cxxsupport/string_utils.o cxxsupport/announce.o \
cxxsupport/walltimer.o

# Default Previewer objects
OBJS_PREVIEWER_DEFAULT = main.o previewer/Previewer.o previewer/libs/core/Parameter.o previewer/libs/core/ParticleSimulation.o \
previewer/libs/core/WindowManager.o previewer/libs/core/Camera.o previewer/libs/core/ParticleData.o \
previewer/libs/core/MathLib.o previewer/libs/core/FileLib.o previewer/libs/events/OnQuitApplicationEvent.o \
previewer/libs/events/OnKeyReleaseEvent.o previewer/libs/events/OnKeyPressEvent.o previewer/libs/events/OnExposedEvent.o \
previewer/libs/events/OnButtonReleaseEvent.o previewer/libs/events/OnButtonPressEvent.o previewer/libs/core/Texture.o \
previewer/libs/animation/AnimationSimulation.o

#temp force render method
RENDER_METHOD = FFSDL
# Current build specific objects
ifeq ($(RENDER_METHOD),FFSDL)

OBJS_BUILD_SPECIFIC = previewer/libs/renderers/FF_DrawList.o previewer/libs/materials/FF_ParticleMaterial.o

endif


# All objects for this build
OBJS = $(OBJS_SPLOTCH_DEFAULT) $(OBJS_PREVIEWER_DEFAULT) $(OBJS_BUILD_SPECIFIC)

# Rules (note: object files automatically removed when building)

.SUFFIXES: .o .cc .cxx .cpp

.cpp.o:
$(CXX) -c $(CPPFLAGS) -o "$@" "$<"

.cc.o:
$(CXX) -c $(CPPFLAGS) -o "$@" "$<"

.cxx.o:
$(CXX) -c $(CPPFLAGS) -o "$@" "$<"


$(EXEC): $(OBJS)
$(CXX) $(OBJS) $(LDFLAGS) -o $(EXEC)
rm $(OBJS)


clean:
rm -f $(OBJS)
rm -f $(EXEC)

我删掉了一两个不必要的东西,因此其中的一两个没有多大意义(为什么有一个渲染方法选项,例如只有一种方法可用)我对我是否正确编写了规则有点模糊,并认为这可以解释我的问题?虽然它看起来与其他似乎有效的 makefile 相同,但我不确定问题出在哪里。有人知道吗?如果需要,我可以提供更多信息吗?

最佳答案

I had some functions declared + defined in a header, and moving their definitions into a cpp removed those functions from the linker errors

这听起来好像它们不是内联的,在这种情况下,您在链接程序时只能使用一个定义。

inline 添加到 header 中的任何函数定义以解决该问题。这放宽了“一个定义规则”,允许在多个翻译单元中定义这些函数,只要所有定义都相同。

更新:此外,您对 OBJS_SPLOTCH_DEFAULT 的定义包含重复项; cxxsupport/paramfile.o重复了,可能还有其他的。您需要删除重复项。我建议按字母顺序保留这样的长列表,以便更容易搜索和发现重复项。

关于c++ - 在 GCC 上构建的函数多重定义链接器错误 - Makefile 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11940191/

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