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 个 ==========
请问这个警告是什么意思
目录结构
代码
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....