gpt4 book ai didi

c++ - 将具有公共(public)头文件的目标文件链接到 main 会给出体系结构 x86_64 错误的重复符号

转载 作者:行者123 更新时间:2023-11-30 03:30:56 33 4
gpt4 key购买 nike

我有以下文件;

./shared/Thread.cpp

./shared/Thread.h

./shared/TimeThread.cpp

./shared/TimeThread.h

./shared/Globals.cpp

./AIServer/main.cpp

./shared/stdafx.h

(我认为将这些文件复制到问题中会使问题的可读性降低,所以我只提供了这些文件的链接。)

我有以下生成文件;

./AIServer/Makefile

    main.o: 
g++ -std=c++11 -c main.cpp

main: 2r 3r 4r main.o
g++ -std=c++11 -o main main.o ../shared/Thread.o ../shared/TimeThread.o ../shared/globals.o

.ONESHELL:
2r:
cd ../shared&&make globals.o
.ONESHELL:
4r:
cd ../shared&&make TimeThread.o
.ONESHELL:
3r:
cd ../shared&&make Thread.o

./shared/Makefile

Thread.o: 
g++ ${CFLAGS} -c Thread.cpp

TimeThread.o:
g++ ${CFLAGS} -c TimeThread.cpp

globals.o:
g++ ${CFLAGS} -c globals.cpp

当我运行时

make main

在 ./AIServer 中,我得到以下错误(错误已编辑)

duplicate symbol __Z9getMSTimev in: main.o ../shared/Thread.o duplicate symbol __Z12CheckPercents in: main.o ../shared/Thread.o duplicate symbol __Z10STRTOLOWERRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE in: main.o ../shared/Thread.o duplicate symbol __Z10STRTOUPPERRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE in: main.o ../shared/Thread.o duplicate symbol __Z9getMSTimev in: main.o ../shared/TimeThread.o duplicate symbol __Z12CheckPercents in: main.o ../shared/TimeThread.o duplicate symbol __Z10STRTOLOWERRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE in: main.o ../shared/TimeThread.o duplicate symbol __Z10STRTOUPPERRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE in: main.o ../shared/TimeThread.o duplicate symbol __Z9getMSTimev in: main.o ../shared/globals.o duplicate symbol __Z12CheckPercents in: main.o ../shared/globals.o duplicate symbol __Z10STRTOLOWERRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE in: main.o ../shared/globals.o duplicate symbol __Z10STRTOUPPERRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE in: main.o ../shared/globals.o ld: 12 duplicate symbols for architecture x86_64

我承认,我对 makefile 的经验不多,我试图解决这个错误几个小时,但不幸的是我无法解决它。

我尝试将对象 ../shared/globals.o ../shared/Thread.o ../shared/TimeThread.o 链接到 ../shared/stdafx.o 然后仅链接此文件到 main,但随后它给出了 undefined symbol 错误等。

如有任何帮助,我将不胜感激。

编辑:如果我如下更改 ./AIServer/Makefile 中的主要规则,

main: 1r 2r 3r 4r main.o stdafx.o
g++ -std=c++11 -stdlib=libc++ -o main main.o stdafx.o

这次我遇到了以下错误,

Undefined symbols for architecture x86_64: "StartTimeThread()", referenced from: _main in main.o "CleanupTimeThread()", referenced from: _main in main.o "myrand(int, int)", referenced from: CheckPercent(short) in main.o CheckPercent(short) in stdafx.o ld: symbol(s) not found for architecture x86_64

最佳答案

错误归结为:

#ifdef _WIN32
#define INLINE __forceinline
#else
#define INLINE __attribute__((always_inline))
#endif

在其中一个支持文件中。

这个定义是错误的。它被误导了,因为编译器很可能比普通程序员更清楚要内联什么。这是错误的,因为就 C++ 而言,inline 关键字具有非常具体的含义,与内联无关。 OTOH 特定于 GCC 的 __attribute__((always_inline))inline 的 C++ 相关含义无关,仅影响内联。 OTTH MSVC 的 __forceinline 同时具有这两种含义。

所以最小的修复是替换

#define INLINE __attribute__((always_inline))

#define INLINE __attribute__((always_inline)) inline

强制内联并使函数 inline 在 C++ 意义上。中间的解决方法是用

替换整个 block
#define INLINE inline

最终的解决方法是完全抛弃 INLINE,只在需要时使用 inline

关于c++ - 将具有公共(public)头文件的目标文件链接到 main 会给出体系结构 x86_64 错误的重复符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44624759/

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