LNK4221

LNK4221

场景:warning LNK4221: 此对象资料未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件

warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件
1>------ 已启动全部重新生成: 项目: base, 配置: Debug Win32 ------
1>  JGEQtree.cpp
1>  AAAAAA.cpp
1>  正在生成代码...
1>AAAAAA.obj : warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件
1>  base.vcxproj -> C:\Users\jim\Desktop\新建文件夹\Debug\base.lib
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

请问这个警告是什么意思

目录结构
LNK4221

代码
jgeUtil.h
#ifndef __JGE_UTIL_H__
#define __JGE_UTIL_H__

#include <memory>

#endif


JGEQtree.h
#ifndef __JGE_QTREE_H__
#define __JGE_QTREE_H__

#include "jgeUtil.h"

#endif


JGEQtree.cpp
#include "JGEQtree.h"


AAAAAA.h
#ifndef __AAAAAA_H__
#define __AAAAAA_H__

#include "jgeUtil.h"

#endif


AAAAAA.cpp
#include "AAAAAA.h"
warning LNK4221

------解决方案--------------------
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E

------解决方案--------------------
MSDN:
错误消息 链接器工具警告 LNK4221
未找到公共符号;存档成员将不可访问
向库添加了不具有公共符号的 .obj 文件。对象中的符号在后面的包括 .lib 的链接器操作中将不可访问。
若要解决此警告,请不要将不具有公共符号的 .obj 文件链接到库中。

(1)编译器将源文件编译成汇编代码,然后由汇编器(assembler)翻译成机器指令
(再加上其它相关信息)后输出到一个个目标文件(object file,VC的编译器编译出
的目标文件默认的后缀名是.obj)中;(2)链接器(linker)将一个个的目标文件
(或许还会有若干程序库)链接在一起生成一个完整的可执行文件。
  编译器编译源文件时会把源文件的全局符号(global symbol)分成强(strong)和弱(weak)
两类传给汇编器,而随后汇编器则将强弱信息编码并保存在目标文件的符号表中。
编译器在连接的时候未找到公共符号,So....