carbide.vs3.0.1链接碰到_GetUserNameA@8未找到问题解决

在Nokia的网站上下载了一个 Open C/C++ Plugins 包,为自己的空工程添加了一下对OpenC的引用。
在 MyTest.mmp 文件中添加了

SYSTEMINCLUDE                           \epoc32\include\stdapis
LIBRARY                                 libc.lib

结果编译出现问题,提示:

SL_All_MSE_Symbian_D.lib(unistd.win32.c.obj) : error LNK2019: CBDERR -- unresolved external symbol _GetUserNameA@8 referenced in function _getlogin

很奇怪的问题,使用GCCE编译没有报错,说明是WINSCW编译器问题,到Nokia论坛上找了一下,也有人碰到这个问题,有一个人回答的比较模糊,说调整一下库文件的连接顺序就好了。于是自己做尝试。

在vs 2005环境中调整libc.lib的引用顺序,在Linker配置中将原先添加

MSL_All_MSE_Symbian_D.lib
kernel32.lib
user32.lib

后面的libc.lib移动到前面,然后在C/C++配置中将

$(EPOCROOT)\epoc32\include\stdapis

放到

$(EPOCROOT)\epoc32\include

前面,变成

$(EPOCROOT)\epoc32\include\stdapis
$(EPOCROOT)\epoc32\include

再次编译,链接时 符号 _GetUserNameA@8 找不到的问题消失,使用GCCE编译还是正常。

Popularity: 4% [?]

Related

Carbide.vs3.0.1以GCCE编译工程出现RCMake.exe异常解决

用vs建立了一个Symbian的空工程,然后放到版本库中,准备作为未来研究Symbian编程的基础工程。
首先试验了一下编译环境是否正常:
首先使用 Deb_S60_30M_WINSCW 方式编译:
没有错误提示,在 开发包的 S60_3rd_MR\Epoc32\release\Winscw\UDeb 目录下可以看到生成的文件。
然后使用 Rel_S60_30M_GCCE 编译:
在编译的最后步骤 VS 出现错误,提示RCMake.exe执行出错。
查看开发包的 S60_3rd_MR\Epoc32\release\GCCE\UREL 目录,有文件生成。
再查看BuildLog.htm 发现在编译日志的最后最后有提示:

System.UnauthorizedAccessException: 对路径“D:\symbian\MyTest\sis\MyTest.pkg”的访问被拒绝。
   在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   在 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
   在 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   在 System.IO.StreamWriter.CreateFile(String path, Boolean append)
   在 System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize)
   在 System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding)
   在 com.nokia.iguana.compilepackage.CompilePackage.UpdatePackageFile(String _projectKeyword, String _platformName, String _buildType, String _projectRoot, ProjectSettings settings, ProjectExtraSettings extraSettings)
   在 com.nokia.iguana.tools.rcmake.TargetBuilder.runOtherPlatform()
   在 com.nokia.iguana.tools.rcmake.RCMakeMain.Run()
   在 com.nokia.iguana.tools.rcmake.RCMakeMain.main(String[] args)

后查证,是由于使用了版本库,文件签入后,.pkg文件只读造成的,将其签出,重新编译,没有错误。
对比了一下.pkg 文件前后变化,原先文件中的目录被实际目录路径替换。

Popularity: 4% [?]

Related

VC2005下编译DirectX出错问题解决

朋友介绍跨平台图形开发包SDL,下载下来在VC下编译进行编译,提示没有DirectXSDK,到M$网站上下载DirectXSDK,显示文件大小4xxMB, 被吓了回来,从别人机器上拷贝了DirectXSDK9.0的Include和Lib目录,只有2XMB, 汗,不知道M$是怎么做的文件,大小相差这么大。

添加相应的include路径到SDL编译环境中,重新编译,出现

….vc\platformsdk\include\winnt.h(222) : error C2061: 语法错误 : 标识符“PVOID64”

等问题。

使用google找到VS2005下编译DirectX程序时出现的类似编译问题,看到一位兄弟给了如下一种解释,觉得比较正确:
POINTER_64是一个宏,在64位编译下起作用,它包含在SDK目录下的BASETSD.H中(Microsoft Visual Studio 8\VC\PlatformSDK\Include\basetsd.h(23):#define POINTER_64 __ptr64),但DXSDK自己也带了一个basetsd.h,里面没有定义POINTER_64,从而导致出错。

解决方法1:
在Tools -> Options -> Projects and Solutions -> VC++ Directories -> Include Files里确保系统包含目录(以S打头的)在最前面,同时在 project properties下面的“C/C++ -> General”中确保“Additional Include Directories”为空(因为它会被优先编译,这样就轮不到VC\ PlatformSDK\Include\basetsd.h),所有的包含目录都应该在上面的include里面。这种方法不用改代码。
解决方法2:
在DXSDK自己的basetsd.h里自己定义#define POINTER_64 __ptr64
我采用了第二种方法。修改后,文件编译通过生成了期望的.lib库文件。

Popularity: 3% [?]

Related

VC下编译libMPG123(补)

前次用VC编译了libMPG123库,编译通过,但是没有进行例子程序编译测试。今天测试了一下用libMPG123做MP3到WAV的解码,结果编译器连接错误,提示找不到符号 _strcasecmp 和 _strncasecmp。使用google大法,发现VC没有strcasecmp和strncasecmp函数,只好为他做了一个补丁。

在.h文文件中添加如下声明:

#ifdef _MSC_VER
int strcasecmp(char *s1, char *s2);
int strncasecmp(char *s1, char *s2, register int n);
#endif

在.c文件中添加如下实现

#ifdef _MSC_VER
int strcasecmp(char *s1, char *s2)
{
   while  (toupper((unsigned char)*s1) == toupper((unsigned char)*s2++))
       if (*s1++ == '') return 0;
   return(toupper((unsigned char)*s1) - toupper((unsigned char)*--s2));
}

int strncasecmp(char *s1, char *s2, register int n)
{
  while (--n >= 0 && toupper((unsigned char)*s1) == toupper((unsigned char)*s2++))
      if (*s1++ == '')  return 0;
  return(n < 0 ? 0 : toupper((unsigned char)*s1) - toupper((unsigned char)*--s2));
}
#endif

编译连接通过。

Popularity: 3% [?]

Related

用VC编译libMPG123库

首先从http://mpg123.org/ 下载最新的源码包,解压后得到如下目录结构
libMPG123目录结构
将src/libmpg123目录下的全部文件拷贝到ports/MSVC++/libMPG123目录下。

打开VS装入libMPG123.vcproj工程文件,按 “生成” 按钮,编译提示 mpg123.h, config.h 文件找不到。查找原始的src文件目录下确实没有这两个文件,但是有mpg123.h.in, config.h.in 两个文件,用记事本打开查看就是c的代码文件,于是将他们拷贝过来后然后去掉后面的 .in 扩展名,编辑 mpg123.h 将前面的

@INCLUDE_STDLIB_H@
@INCLUDE_SYS_TYPE_H@

两行替换为

#include <stdlib.h>
#include <sys/types.h>

再进行编译,提示

libmpg123\mpg123.h(732) : error C2081: “ssize_t”: 形参表中的名称非法

网上搜了一把原来是 VC 中没有ssize_t这个类型定义,于是按照config.h最后面的提示在mpg123.h 中添加如下一个类型定义

#ifdef _MSC_VER
typedef long ssize_t;
#endif

再次编译,还是提示出错,主要是在 mpg123lib_intern.h中提示有一些引入的 .h 文件找不到,找到相对应的错误行可以看到是由一个 #ifdef 定义的开关来做引入库定义的,通过查找发现这些名称是在 config.h 中定义的,记下名称,到config.h 中将对应该名称的 #define 语句注释掉。
再次重新编译,还是失败,分析发现是由于一个ALIGNED(16) 的宏造成的。通过在工程中查找ALIGNED,发现
他是在 config.h 文件中通过

#define CCALIGN 1

来控制使用ALIGNED的,可以将其注释掉,或者在optimize.h中将ALIGNED(a)的宏定义由

#ifdef CCALIGN
#define ALIGNED(a) __attribute__((aligned(a)))
#else
#define ALIGNED(a)
#endif

修改为


#ifdef CCALIGN
#ifdef _MSC_VER
#define ALIGNED(a) __declspec(align(a))
#else
#define ALIGNED(a) __attribute__((aligned(a)))
#endif
#else
#define ALIGNED(a)
#endif

再重新编译,没有新的error 出来,编译通过。
编译工作到此结束,以后就可以通过VC来试验用libMPG123来进行mp3解码了。

附:网上一篇文章,gcc和VC编译器的一些差异

http://www.mathmagic.cn/bbs/read.php?tid=7145

Popularity: 3% [?]

Related