2013-08-21 218 views
7

我使用Microsoft Visual Studio 2010,和我工作的开源ClamAV的,我的代码如下这是产生错误LINK:致命错误LNK1181:无法打开输入文件“libclamav.lib”

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <io.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <clamav.h> 


int main(int argc, char **argv) 
{ 
int fd, ret; 
unsigned long int size = 0; 
unsigned int sigs = 0; 
long double mb; 
const char *virname; 
struct cl_engine *engine; 


if(argc != 2) { 
printf("Usage: %s file\n", argv[0]); 
return 2; 
} 

if((fd = open(argv[1], O_RDONLY)) == -1) { 
printf("Can't open file %s\n", argv[1]); 
return 2; 
} 

if((ret = cl_init(CL_INIT_DEFAULT)) != CL_SUCCESS) { 
printf("Can't initialize libclamav: %s\n", cl_strerror(ret)); 
return 2; 
} 

if(!(engine = cl_engine_new())) { 
printf("Can't create new engine\n"); 
return 2; 
} 

/* load all available databases from default directory */ 
if((ret = cl_load(cl_retdbdir(), engine, &sigs, CL_DB_STDOPT)) != CL_SUCCESS) { 
printf("cl_load: %s\n", cl_strerror(ret)); 
close(fd); 
    cl_engine_free(engine); 
return 2; 
} 

printf("Loaded %u signatures.\n", sigs); 

/* build engine */ 
if((ret = cl_engine_compile(engine)) != CL_SUCCESS) { 
printf("Database initialization error: %s\n", cl_strerror(ret));; 
    cl_engine_free(engine); 
close(fd); 
return 2; 
} 

/* scan file descriptor */ 
if((ret = cl_scandesc(fd, &virname, &size, engine, CL_SCAN_STDOPT)) == CL_VIRUS) { 
printf("Virus detected: %s\n", virname); 
} else { 
if(ret == CL_CLEAN) { 
    printf("No virus detected.\n"); 
} else { 
    printf("Error: %s\n", cl_strerror(ret)); 
    cl_engine_free(engine); 
    close(fd); 
    return 2; 
} 
} 
close(fd); 

/* free memory */ 
cl_engine_free(engine); 

/* calculate size of scanned data */ 
mb = size * (CL_COUNT_PRECISION/1024)/1024.0; 
printf("Data scanned: %2.2Lf MB\n", mb); 

return ret == CL_VIRUS ? 1 : 0; 
} 
给出产生

以下错误 LINK:致命错误LNK1181:无法打开输入文件“libclamav.lib”

亲切指导我

+0

C或C++? 2013-08-21 08:11:33

+0

传统上,UNIX世界中的libXYZ.a是Windows世界中的XYZ.lib。你似乎混合了这两个世界。 – trojanfoe

+0

你的代码可能没有问题。错误在于你编译它的方式。请提供一些细节。 – hivert

回答

14

你得到在Visual Studio中的LNK1181错误时的.lib或.obj文件在链接期间指定的不是在当前目录中找到由LIBPATH链接器选项或LIB环境变量中指定的任何目录指定的任何目录。

您可以添加包含libclamav.lib库文件到LIBPATH解决该问题的目录(这说明可能会因您的Visual Studio版本会略有不同):

  1. 在解决方案资源管理器中,右键单击项目,然后单击属性
  2. 属性页对话框,展开链接,然后单击一般
  3. 其他库目录字段中,指定libclamav.lib所在的路径。

LIBPATH包含空格时也会发生此错误。如果是这种情况,请将库移动到不带空格的路径中,或在路径周围加上引号。

+1

我希望我能给你1000个upvotes!我正在尝试更新旧项目,并且LIBPATH中有空格。我一直在寻找似乎是几个小时,而其他人都没有提出这样的建议。我不知道它是如何在原始的开发环境中工作的!也许他们也碰巧在LIB中拥有它......无论如何,我不知道VS的moderner版本是如何处理这个问题的,但VC++ 6(别问!)并没有优雅地失败。 – shiser

+0

为了防止其他人绊倒在这,我的错误是更基本和愚蠢的。我试图建立在“仅项目”内。确保先建立你的依赖关系!因此,右键单击您的项目文件,然后单击生成。 – Karoh

1

您也可以通过指定DOS“8.3”格式的库路径来修复它。

要得到8.3的形式,这样做(在命令行):

DIR /AD /X 

递归通过目录的各个层面。

相关问题