2013-08-21 27 views
7

Tôi đang sử dụng Microsoft Visual Studio 2010, và tôi đang làm việc trên mã nguồn mở Clamav, mã của tôi được đưa ra dưới đây được tạo ra một lỗiLINK: fatal error LNK1181: không thể mở tập tin đầu vào '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; 
} 

lỗi sau đây được tạo LINK: fatal error LNK1181: không thể mở tập tin đầu vào 'libclamav.lib'

vui lòng hướng dẫn cho tôi

+0

C hoặc C++?

+0

Thông thường những gì libXYZ.a trong UNIX-thế giới là XYZ.lib trong Windows-thế giới. Bạn dường như đang trộn lẫn hai thế giới. – trojanfoe

+0

Có thể không có gì sai với mã của bạn. Lỗi là cách bạn biên dịch nó. Xin vui lòng cho một số chi tiết. – hivert

Trả lời

14

Bạn nhận được một lỗi LNK1181 trong Visual Studio khi .lib hoặc file .obj được chỉ định trong khi liên kết không được tìm thấy trong thư mục hiện tại, bất kỳ thư mục nào được chỉ định bởi tùy chọn liên kết LIBPATH hoặc bất kỳ thư mục nào được chỉ định trong biến môi trường LIB.

Bạn có thể thêm các thư mục chứa tập tin libclamav.lib thư viện để các LIBPATH để giải quyết vấn đề (hướng dẫn này có thể thay đổi một chút tùy thuộc vào phiên bản Visual Studio của bạn):

  1. Trong Solution Explorer, nhấn phải chuột lên dự án, và sau đó nhấp vào Thuộc tính.
  2. Trong Trang Sở hữu hộp thoại, mở rộng Linker, và sau đó nhấp vào chung.
  3. Trong các trường Thư viện bổ sung Thư mục, chỉ định đường dẫn nơi libclamav.lib cư trú.

Lỗi cũng có thể xảy ra khi LIBPATH chứa khoảng trắng. Nếu đúng như vậy, hãy di chuyển thư viện sang đường dẫn không có dấu cách hoặc đặt dấu ngoặc kép quanh đường dẫn.

+1

Tôi ước tôi có thể cung cấp cho bạn 1000 phiếu bầu! Tôi đang cố gắng cập nhật dự án kế thừa và LIBPATH có không gian trong đó. Tôi đã tìm kiếm những gì có vẻ như giờ, và không ai khác đề nghị điều đó. Tôi không có ý tưởng làm thế nào nó đã được làm việc trên môi trường dev gốc! Có lẽ họ cũng tình cờ có nó trong LIB ghê gớm ... Trong mọi trường hợp, tôi không biết làm thế nào các phiên bản hiện đại của VS đối phó với điều đó, nhưng VC++ 6 (Đừng hỏi!) Đã không thất bại một cách duyên dáng nào. – shiser

+0

Chỉ trong trường hợp bất cứ ai khác tình cờ này, sai lầm của tôi là cơ bản hơn và ngớ ngẩn. Tôi đã cố gắng xây dựng trong "dự án duy nhất". Hãy chắc chắn để xây dựng phụ thuộc của bạn đầu tiên! Vì vậy, nhấp chuột phải vào tệp dự án của bạn và nhấp vào xây dựng. – Karoh

1

Bạn cũng có thể sửa lỗi bằng cách chỉ định đường dẫn thư viện ở định dạng DOS "8.3".

Để có được hình thức 8.3, làm (tại dòng lệnh):

DIR /AD /X 

đệ quy qua mọi cấp độ của các thư mục.

Các vấn đề liên quan