我有以下文件;
(我认为将这些文件复制到问题中会使问题的可读性降低,所以我只给出了文件的链接。)
我有以下makefile;
./ AIServer /生成文件
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
./共享/生成文件
Thread.o:
g++ ${CFLAGS} -c Thread.cpp
TimeThread.o:
g++ ${CFLAGS} -c TimeThread.cpp
globals.o:
g++ ${CFLAGS} -c globals.cpp
当我跑步时
在./AIServer中制作主要
,我收到以下错误(编辑错误)
重复符号__Z9getMSTimev in: main.o ../shared/Thread.o重复符号__Z12CheckPercents in: main.o ../shared/Thread.o重复符号__Z10STRTOLOWERRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE 在: main.o ../shared/Thread.o重复符号__Z10STRTOUPPERRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE 在: main.o ../shared/Thread.o复制符号__Z9getMSTimev in: main.o ../shared/TimeThread.o重复符号__Z12CheckPercents in: main.o ../shared/TimeThread.o重复符号__Z10STRTOLOWERRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE 在: main.o ../shared/TimeThread.o重复符号__Z10STRTOUPPERRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE 在: main.o ../shared/TimeThread.o重复符号__Z9getMSTimev in: main.o ../shared/globals.o复制符号__Z12CheckPercents in: main.o ../shared/globals.o重复符号__Z10STRTOLOWERRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE 在: main.o ../shared/globals.o重复符号__Z10STRTOUPPERRNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE 在: main.o ../shared/globals.o ld:12个用于体系结构x86_64的重复符号
我承认,我对makefile没有多少经验,而且我试图解决这个错误几个小时,但不幸的是我无法解决它。
我试图将对象../shared/globals.o ../shared/Thread.o ../shared/TimeThread.o链接到../shared/stdafx.o然后链接这个文件到main,但后来它给出了未定义的符号错误等。
我将不胜感激。
修改 如果我将./AIServer/Makefile中的主规则更改为以下内容,
main: 1r 2r 3r 4r main.o stdafx.o
g++ -std=c++11 -stdlib=libc++ -o main main.o stdafx.o
这次我收到以下错误,
架构x86_64的未定义符号:" StartTimeThread()", 引自: _main in main.o" CleanupTimeThread()",引自: _main in main.o" myrand(int,int)",引用自: 在main.o中的CheckPercent(短) stdafx.o中的CheckPercent(短)ld:找不到架构x86_64的符号
答案 0 :(得分:2)
错误归结为:
#ifdef _WIN32
#define INLINE __forceinline
#else
#define INLINE __attribute__((always_inline))
#endif
在其中一个支持文件中。
这个定义是误导和错误的。这是错误的,因为编译器绝对有可能比普通程序员更好地了解内联内容。这是错误的,因为就C ++而言,inline
关键字具有非常特定的含义,与内联无关。特定GCC __attribute__((always_inline))
的OTOH与inline
的C ++相关的含义无关,只影响内联。 OTTH MSVC __forceinline
同时具有两种含义。
因此最小修正将取代
#define INLINE __attribute__((always_inline))
与
#define INLINE __attribute__((always_inline)) inline
强制内联并在C ++意义上使函数inline
。中间修复是用
#define INLINE inline
最终解决方法是完全抛弃INLINE
,只需在需要时使用inline
。