【问题标题】:Getting multiple definition error [closed]获得多个定义错误[关闭]
【发布时间】:2009-11-26 02:30:19
【问题描述】:

我正在尝试编译一些 c++ 文件。我在链接阶段(正在编译)遇到以下类型的错误 -


Main.o: In function operator<<(std::basic_ostream<char, std::char_traits<char> >&, Set const&)':
/usr/include/c++/4.3/new:105: multiple definition of
operator<<(std::basic_ostream< char, std::char_traits >&, Set const&)' bundleXX.o:/xxx/DATASTRUCTURES/SET/set.h:162: first defined h ere

Main.o: In function print(std::basic_string<char, std::char_traits<char>, std::allo cator<char> >, int)':
/xxx/misc.h:28: multiple definition of
print(std::basic_string, std::allocator >, int)' bundleXX.o:/xxx/misc.h:28: first defined here


此代码之前链接正确。只有当我尝试将此代码与其他一些代码接口时,才会出现问题。

我的 makefile 是这样的:-
Makefile


SRC = Main.C Bundle.C bundleXX.C BMinQuad.C MinQuad.C QPBundle.C OBJ = Main.o Bundle.o MinQuad.o BMinQuad.o QPBundle.o bundleXX.o general_includes.o CCC = g++ EXE = main OPT = -O3 -fomit-frame-pointer -fno-strict-aliasing DEBUG = -g -DDEBUG

IFLAGS = -I /xxx/ -I /xxx/DATASTRUCTURES/HEAP/ -I /xxx/DATASTRUCTURES/ LFLAGS = -lm

Main.o: $(SRC) $(CCC) $(DEBUG) $(LFLAGS) -I /xxx/ -I /xxx/DATASTRUCTURES/ -c $(SRC)

main: $(OBJ) $(CCC) $(OBJ) -I /xxx/ -I /xxx/DATASTRUCTURES/ -o $(EXE) /bin/rm -rf main.o

clean: /bin/rm -rf main.o /bin/rm -rf $(EXE) touch out.out /bin/rm -rf *.out


我将不胜感激。

谢谢

编辑:我尝试过内联,但没有奏效。我终于最小化了我在新代码中包含我的代码的次数,并且它最终正确链接。我认为这可能是递归包含的情况。不过感谢您的帮助。

【问题讨论】:

    标签: c++ g++ linker compiler-errors


    【解决方案1】:

    print(std::string, int) 和 operator

    尝试在这些函数之前添加内联函数,或在您要链接的 C 文件之一中定义函数。

    编辑: 您提到您正在执行“递归”的编辑包括: 你的包含文件周围有#ifdef 保护吗? 这将防止同一个翻译单元多次包含同一个标题。

    #ifndef __MY_FILENAME_H_
    #define __MY_FILENAME_H_
    // your header details
    #endif // End of the file...
    

    定义可以是任何东西,只要它对头文件是唯一的。只需遵循某种标准即可。

    【讨论】:

      【解决方案2】:

      链接阶段的多个定义几乎总是由头文件中的代码引起,但我不确定这里是不是这种情况。

      查看xxx/DATASTRUCTURES/SET/set.h 的第 162 行和xxx/misc.h 的第 28 行(在此处发布它们,两边各写几行以获取更多帮助)。

      根据您收到的消息,这似乎是冲突所在。您正在与之交互的新内容很可能与您当前的某些内容共享一个类型名称。

      【讨论】:

        【解决方案3】:

        misc.hset.h 中,您实际上定义了链接器错误中提到的函数,还是只是将它们声明为存根?

        如果您实际定义它们(即,如果您实际实现函数体),那么您可能会在链接器阶段遇到多个定义问题。您可以在单独的.cpp 文件中定义它们,或者使用inline 关键字声明它们。如果它们是非常短的函数,则后一种选择会更好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-22
          • 2018-04-23
          • 1970-01-01
          • 2010-09-11
          相关资源
          最近更新 更多