2015-05-04 77 views
1

我正在学习C Windows RPC编程。这里是我编写和编译没有错误的虚拟RPC服务器的源代码:Windows RPC编程错误:LNK 2019无法解析的外部符号RPCServerListen

#include <stdio.h> 
#include "md5_h.h" 
#include "rpc.h" 
#include "rpcndr.h" 

int main() { 
    RPC_STATUS status; 

    status = RpcServerUseProtseqEp(
    (RPC_WSTR)("ncacn_ip_tcp"), 
    RPC_C_PROTSEQ_MAX_REQS_DEFAULT, 
    (RPC_WSTR)("9191"), 
    NULL); 
if (status) { exit(status); } 

status = RpcServerRegisterIf(
    md5_v1_0_c_ifspec, 
    NULL, 
    NULL); 
if (status) { exit(status); } 

status = RpcServerListen(
    1, 
    RPC_C_LISTEN_MAX_CALLS_DEFAULT, 
    FALSE); 
if (status) { exit(status); } 

return 0; 
} 

void __RPC_USER midl_user_free(void* p) { 
    free(p); 
} 

void md5(const unsigned char* szMsg) { 
    printf("voila %s\n", szMsg); 
} 

midl文件也可以编译而不会出错。如预期的那样,MIDL汇编产生md5_s.cmd5_c.c。下面是md5.idl文件如果需要的话:

[ 
uuid(D86FBC01-D6A7-4941-9243-07A4EC65E8CB), 
    version(1.0), 
] 
interface md5 
{ 
    void md5([in, string] const char* szMsg); 
}; 

在联动阶段以下错误产生:

LNK2019: unresolved external symbol __imp__RpcServerListen referenced in function main 

我对每一个具体的RPC的功能相同的错误,如RpcServerRegisterIfRpcServerUseProtseqEp。我正在使用Microsoft Visual Studio 2013.

我认为这来自一个缺少包括;但我无法确定哪一个。我试图包括rpc.h,没有任何改变。

我必须在我的项目中包含制作的md5_s.c吗?我已经尝试过,但没有解决任何问题。

感谢您的帮助!

回答

3

您需要链接到Rpcrt4.lib。 如果您使用visual studio,请将其添加到项目 - >属性 - >配置属性 - >链接器 - >输入 - >其他依赖项中。

+0

谢谢,这解决了我遇到的问题;但你到底是怎么想出来的? – philippe

+1

@philippe这是一个链接错误。并非所有的.lib文件都包含在默认列表中。所以有时你需要添加额外的.lib文件。例如:winsock,shell API和e.t.c.需要手动添加.lib文件。当链接器发出错误时,请检查MSDN中的页脚注释,它会列出要使用的库文件,本例中为Rpcrt4.lib。 – shebaw

相关问题