将具有公共头文件的目标文件链接到main会为架构x86_64错误

时间:2017-06-19 07:38:26

标签: c++ macos c++11 makefile linker

我有以下文件;

  

./shared/Thread.cpp

     

./shared/Thread.h

     

./shared/TimeThread.cpp

     

./shared/TimeThread.h

     

./shared/Globals.cpp

     

./AIServer/main.cpp

     

./shared/stdafx.h

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

我有以下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的符号

1 个答案:

答案 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