dapli
驱动牛犊
驱动牛犊
  • 注册日期2007-04-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分411分
  • 威望52点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
阅读:1761回复:3

unresolved external symbol 问题

楼主#
更多 发布于:2007-12-15 10:29
WinCE5.0
我在init.c里用了一个外部全局变量(在bootpart.cpp里定义过)
extern   DWORD   g_dwLastWrittenLoc
并在函数里使用这个变量
然后build   oal这个project,没有问题
并且生成了oal.lib

但是我再build   kern这个project,却出现错误
oal.lib(init.obj)   :   error   LNK2001:   unresolved   external   symbol   g_dwLastWrittenLoc

kern的Source文件里我已经加了含有 DWORD   g_dwLastWrittenLoc 的库文件bootpart.lib

请问这是什么原因?
在eboot/nand.cpp里我看到是这样用全局变量的
extern   "C"
{
#include   <windows.h>
#include   <bsp.h>
#include   "loader.h"
#include   <fmd.h>
extern   DWORD                 g_ImageType;
extern   UCHAR                 g_TOC[SECTOR_SIZE];
extern   const   PTOC       g_pTOC;
extern   DWORD                 g_dwTocEntry;
extern   PBOOT_CFG         g_pBootCfg;
extern   BOOL                   g_bBootMediaExist;
extern   MultiBINInfo   g_BINRegionInfo;
extern   DWORD                 g_dwImageStartBlock;
extern   BOOL                   g_bWaitForConnect; //   Is   there   a   SmartMedia   card   on   this   device?
}
但是如果我在init.c里加上
extern   "C"
{
extern       DWORD       g_dwLastWrittenLoc  
}
因为不是C++文件,build会出现错误的extern   "C"   :error   C2059:   syntax   error   :   'string'
三千水击,九万扶摇
shaohui99
驱动牛犊
驱动牛犊
  • 注册日期2007-05-15
  • 最后登录2008-06-19
  • 粉丝0
  • 关注0
  • 积分190分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-12-17 10:06
一般在头文件中用
#if __cplusplus
extern "C" {
#endif

#if __cplusplus
}
#endif
将函数或者变量说明包起来,这样就能自动区分CPP和C文件了
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-12-17 21:16
在CPP文件中用:
extern "C"     DWORD      g_dwLastWrittenLoc

就行了.
学海无涯
dapli
驱动牛犊
驱动牛犊
  • 注册日期2007-04-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分411分
  • 威望52点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-12-18 10:26
嗯,解决了,C,C++混编问题
三千水击,九万扶摇
游客

返回顶部