error LNK2001: unresolved external symbol _WHX_Close@0 这个错误怎么解决

sky_163 2013-08-15 09:05:02
大家帮忙看下这个错误怎么解决
Linking...
main.obj : error LNK2001: unresolved external symbol _WHX_Close@0
main.obj : error LNK2001: unresolved external symbol _WHX_Read@8
main.obj : error LNK2001: unresolved external symbol _WHX_OpenEx@8
main.obj : error LNK2001: unresolved external symbol _WHX_Done@0
main.obj : error LNK2001: unresolved external symbol _WHX_Init@4
Debug/main.exe : fatal error LNK1120: 5 unresolved externals
Error executing link.exe.

main.exe - 6 error(s), 0 warning(s)
...全文
223 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhctj159 2013-08-16
  • 打赏
  • 举报
回复
可以从dll得到lib 先用Visual Studio自带的dumpbin.exe: dumpbin /exports whxapi.dll > whxapi.def,得到一个whxapi.def文件的输出段: ordinal hint RVA name 2 0 00001005 func1 3 1 0000100F func2 ... 修改为: LIBRARY "whxapi" EXPORTS func1 @2 func2 @3 ... 然后执行lib.exe /def:whxapi.def就会生成whxapi.lib文件
zhctj159 2013-08-16
  • 打赏
  • 举报
回复
引用 16 楼 a307871404 的回复:
[quote=引用 13 楼 zhctj159 的回复:] [quote=引用 11 楼 zhctj159 的回复:] 当然可能还需要一个dll对应的lib文件来得到函数的实际地址;或者使用LoadLibrary加载dll,然后使用GetProcAddress来获得所需要函数的实际地址。
我没有dll对应的lib文件,用这个LoadLibrary函数加载DLL应该写在哪个位置[/quote]可以从dll得到lib 先用Visual Studio自带的dumpbin.exe: dumpbin /exports whxapi.dll > whxapi.def,得到一个whxapi.def文件的输出段: ordinal hint RVA name 2 0 00001005 func1 3 1 0000100F func2 ... 修改为: LIBRARY "test" EXPORTS func1 @2 func2 @3 ... 然后执行lib.exe /def:test.def就会生成test.lib文件
sky_163 2013-08-15
  • 打赏
  • 举报
回复
whxapi.h 源码
 

extern "C" {

#ifndef LPLONGLONG
#define LPLONGLONG LONGLONG*
#endif

int __stdcall WHX_Init(
   int APIVersion = 1
);

bool WINAPI WHX_Done(
);

bool WINAPI WHX_Open(
   LPCSTR lpResName
);

bool WINAPI WHX_Create(
   LPCSTR lpPathName,
   int Size
);

bool WINAPI WHX_Close(
					  );
bool WINAPI WHX_CloseAll(
);

bool WINAPI WHX_NextObj(
);

bool WINAPI WHX_Save(
);

bool WINAPI WHX_SaveAs(
   LPCSTR lpNewFileName
);

bool WINAPI WHX_SaveAll(
);

bool WINAPI WHX_OpenEx(
   LPCSTR lpResName,
   int Param
);

bool WINAPI WHX_Read(
   LPVOID lpBuffer,
   int Bytes
);

bool WINAPI WHX_Write(
   LPVOID lpBuffer,
   int Bytes
);

bool WINAPI WHX_GetSize(
   LPLONGLONG lpSize
);

bool WINAPI WHX_Goto(
   LONGLONG Ofs
);

bool WINAPI WHX_Move(
   LONGLONG Distance
);

bool WINAPI WHX_CurrentPos(
   LPLONGLONG lpOfs
);

bool WINAPI WHX_SetBlock(
   LONGLONG Ofs1,
   LONGLONG Ofs2
);

bool WINAPI WHX_Copy(
);

bool WINAPI WHX_CopyIntoNewFile(
   LPCSTR lpNewFileName
);

bool WINAPI WHX_Cut(
);

bool WINAPI WHX_Remove(
);

bool WINAPI WHX_Paste(
);

bool WINAPI WHX_WriteClipboard(
);

bool WINAPI WHX_Find(
   LPCSTR lpData,
   LPCSTR lpOptions
);

bool WINAPI WHX_Replace(
   LPCSTR lpData1,
   LPCSTR lpData2,
   LPCSTR lpOptions
);

bool WINAPI WHX_WasFound(
);

int WINAPI WHX_WasFoundEx(
);

bool WINAPI WHX_Convert(
   LPCSTR lpSrcFormat,
   LPCSTR lpDstFormat
);

bool WINAPI WHX_Encrypt(
   LPCSTR lpKey,
   int Algorithm
);

bool WINAPI WHX_Decrypt(
   LPCSTR lpKey,
   int Algorithm
);

bool WINAPI WHX_GetCurObjName(
   LPCSTR lpObjName
);

bool WINAPI WHX_SetFeedbackLevel(
   int Level
);

bool WINAPI WHX_GetErrorMsg(
   LPCSTR lpErrorMsg
);

bool WINAPI WHX_SetErrorMsg(
   LPCSTR lpErrorMsg
);

bool WINAPI WHX_GetStatus(
   LPCSTR lpInstPath,
   LPLONG lpWHXVersion,
   LPLONG lpWHXSubVersion,
   LPLONG lpReserved
);

}
sky_163 2013-08-15
  • 打赏
  • 举报
回复
main.cpp 源码

///////////////////////////////////////////////////////////////////////////////
// WinHex C sample
// Copyright 2004 X_ways Software Technology AG
///////////////////////////////////////////////////////////////////////////////

#include <windows.h>
#include <iostream>
//#include <Winsock2.h>


using namespace std;

#include "whxapi.h"

void DumpBuf (char* buf, int count)
{
    const char HexChars[] = "0123456789abcdef";
    const int ValuesPerLine = 16;
    const int AddressChars = 4;
    int i, j;

    for (i = 0; i * ValuesPerLine < count; i++) {

        for (j = AddressChars-2; j >= 0; j--)
            cout << HexChars[(i >> (j*4)) & 15];
        cout << "0: ";

        //cout << HexChars[(i>>4) & 15] << HexChars[i & 15] << "0: ";
        for (j = 0; j < ValuesPerLine; j++) {
            if (i * ValuesPerLine + j < count) {
                unsigned char c = buf[i * ValuesPerLine + j];
                cout << HexChars[(c>>4) & 15] << HexChars[c & 15] << " ";
            } else
                cout << "   ";
        }

        for (j = 0; j < ValuesPerLine; j++) {
            if (i * ValuesPerLine + j < count) {
                unsigned char c = max (buf[i * ValuesPerLine + j], 32);
                cout << c;
            } else
                cout << " ";
        }
        cout << endl;
    }
}

///////////////////////////////////////////////////////////////////////////////

int main (int argc, char** argv)
{
   // Open a file in read-only mode (flag 0x1).
   // You can also open an image file with the contents of a disk and interpret 
   // it as such by specifying another flag (0x4).
   if (argc < 2) {
      cout << "Please give a file name" << endl;
      return 1;
   }

   // Initialize the WinHex API, so that it is ready for use
   int initRes = WHX_Init(1);
   if (initRes <= 0) {
      cout << "Could not initialize WinHexAPI.dll, error" << initRes << endl;
      WHX_Done();
      return 1;
   } else if (initRes == 2) {
      cout << "Opened WinHex API, evaluation version" << endl;
   }
   
   if (! WHX_OpenEx(argv[1], 0x00000001)) {
      cout << "Error opening " << argv[1] << endl;
      WHX_Done();
      return 1;
   }

   //WHX_Goto(SomeOffset);
   char buf[256];
   WHX_Read(buf, sizeof(buf));
   DumpBuf(buf, sizeof(buf));

   // Close the file
   WHX_Close();

   // Properly free all allocated resources and release the WinHex API
   WHX_Done();

   return 0;
}
sky_163 2013-08-15
  • 打赏
  • 举报
回复
源码我传到网盘了 http://pan.baidu.com/share/link?shareid=3582590789&uk=4228913014 被调用的dll文件和源码在一个目录里
孤影品茗 2013-08-15
  • 打赏
  • 举报
回复
上代码,然后告诉我们你用了哪些dll文件,这些dll文件在什么位置,这些dll的导入库lib文件有没有
mujiok2003 2013-08-15
  • 打赏
  • 举报
回复
引用 5 楼 mujiok2003 的回复:
1.提供头文件+到处符号文件(lib),使用隐式加载 2.使用动态加载
到处->导出
mujiok2003 2013-08-15
  • 打赏
  • 举报
回复
1.提供头文件+到处符号文件(lib),使用隐式加载 2.使用动态加载
ztenv 版主 2013-08-15
  • 打赏
  • 举报
回复
如果用了第额外的库,检查有没有配置lib的路径
ztenv 版主 2013-08-15
  • 打赏
  • 举报
回复
引用 楼主 a307871404 的回复:
大家帮忙看下这个错误怎么解决 Linking... main.obj : error LNK2001: unresolved external symbol _WHX_Close@0 main.obj : error LNK2001: unresolved external symbol _WHX_Read@8 main.obj : error LNK2001: unresolved external symbol _WHX_OpenEx@8 main.obj : error LNK2001: unresolved external symbol _WHX_Done@0 main.obj : error LNK2001: unresolved external symbol _WHX_Init@4 Debug/main.exe : fatal error LNK1120: 5 unresolved externals Error executing link.exe. main.exe - 6 error(s), 0 warning(s)
是不是函数只声明了而没有定义?
sky_163 2013-08-15
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:
能否帮我调试下,源码在 http://pan.baidu.com/share/link?shareid=3582590789&uk=4228913014
max_min_ 2013-08-15
  • 打赏
  • 举报
回复
一般出现lnk错误都是库文件没添加造成的。 项目--》属性--》配置属性--》链接器-》输入--》附加依赖项 在其中加入所需库文件,同时在“链接器--》常规--》附加库目录”中填入相应库名。 这样应该就可以 这样还不行的话, 那源文件是.c改成.cpp文件。如果是.cpp文件改成.c文件 试试
sky_163 2013-08-15
  • 打赏
  • 举报
回复
引用 13 楼 zhctj159 的回复:
[quote=引用 11 楼 zhctj159 的回复:] 当然可能还需要一个dll对应的lib文件来得到函数的实际地址;或者使用LoadLibrary加载dll,然后使用GetProcAddress来获得所需要函数的实际地址。
我没有dll对应的lib文件,用这个LoadLibrary函数加载DLL应该写在哪个位置
赵4老师 2013-08-15
  • 打赏
  • 举报
回复
将你源代码的后缀由.cpp改为.c
赵4老师 2013-08-15
  • 打赏
  • 举报
回复
用命令 dumpbin /EXPORTS whxapi.lib 查看whxapi.lib都导出了哪些函数。
zhctj159 2013-08-15
  • 打赏
  • 举报
回复
引用 11 楼 zhctj159 的回复:
这是调用约定不对应造成的。。。你头文件里应该使用C调用约定_cdecl而不是标准调用约定 C调用约定使用时对于函数名的修饰规则是 只在前面加下划线 标准调用约定对于函数名的修饰规则是 在前面加下划线后面跟@符号再加上参数的字节总数
当然可能还需要一个dll对应的lib文件来得到函数的实际地址;或者使用LoadLibrary加载dll,然后使用GetProcAddress来获得所需要函数的实际地址。
大尾巴猫 2013-08-15
  • 打赏
  • 举报
回复
main.cpp #pragma comment(lib, "whxapi.lib") //加上dll的文件名
zhctj159 2013-08-15
  • 打赏
  • 举报
回复
这是调用约定不对应造成的。。。你头文件里应该使用C调用约定_cdecl而不是标准调用约定 C调用约定使用时对于函数名的修饰规则是 只在前面加下划线 标准调用约定对于函数名的修饰规则是 在前面加下划线后面跟@符号再加上参数的字节总数

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧