2016-09-02 4 views
2

Я получаю ошибку fatal error LNK1120: 3 unresolved externals при компиляции моей программы с помощью Developer CMD Prompt для VS2012.Unresolved externals (LNK1120)

Каждый неразрешенный внешний символ имеет ошибку: LNK2019

nickman.obj : error LNK2019: unresolved external symbol _scrninit referenced in function _main 
nickman.obj : error LNK2019: unresolved external symbol _scrnnrml referenced in function _main 
nickman.obj : error LNK2019: unresolved external symbol _scrneng referenced in function _main 

При компиляции с помощью GCC я получить

cannot find -lpthread collect2.exe: error: ld returned 1 exit status

Мне сказали, что это также из-за неразрешенных символов.

Я не вижу ничего плохого в том, что я сделал, но, возможно, кто-то еще может. Я предполагаю, что есть проблема с тем, как я включил файл заголовка

Вот мой код:

nickman.c

#include "nickman.h" 

void main(void) 
{ 
    unsigned int curr_dat = 0; // The current dat file to use 
    unsigned char ch = 0;  // Key entered at keyboard 
    unsigned char lastkey = 0; // Last key entered (movement command) 

    if (scrninit()) { 
     printf("\nThere was an error initializing the screen."); 
     exit(-1); 
    } 

    if (scrneng(curr_dat)) { 
     printf("\nThere was an error creating the screen."); 
     scrnnrml(); 
     exit(-2); 
    } 

    //to leave it on there for us to see 
    getch(); 

    scrnnrml(); 
} 

nickman.h

extern int scrninit();     // the screen initialize routine 
extern  scrnnrml();     // reset screen to normal 
extern int scrneng(unsigned curr_dat); // the screen display engine routine 

screen.c

#include "screen.h" 

// the screen initialize routine 
int scrninit() 
{ 
    _asm { 
     mov ax,0013h 
     int 10h 
    } 
    return(0); // for now (no error) 
} 

void scrnnrml() 
{ 
    _asm { 
     mov ax,0003h 
     int 10h 
    } 
} 

void display_item(int item_num, int x, int y) 
{ 
    unsigned int postn, temp; 

    y *= 10; 
    x *= 10; 
    postn = y * 320 + x; 
    temp = item_num * 100; 

    _asm { 
     push ds 
     push es 
     push si 
     push di 
     mov ax,0A000h 
     mov es,ax 
     mov si,offset itembitmap 
     add si,temp 
     mov di,postn 
     mov ax,seg itembitmap 
     mov ds,ax 
     mov cx,10 
loop1: 
     push cx 
     mov cx,05 
     rep movsw 
     add di,310 
     pop cx 
     loop loop1 
     pop di 
     pop si 
     pop es 
     pop ds 
    } 
} 

scrneng.c

#include <stdio.h> 
#include <stdlib.h> 

#include "scrneng.h" 

    // the screen display engine routine 
int scrneng(unsigned curr_dat) 
{ 
    FILE *fp; 
        int i,j; 
    unsigned char dat_file[] = "SCRN00.DAT"; 
    unsigned char scrn_grid[21][33]; 

    // open, read in the grid, and close the file 
    if((fp = fopen(dat_file,"rb"))==NULL) { 
     printf("\nError opening file"); 
     return(1); 
    } 
    for (i=1;i<=20;i++) { 
     for (j=1;j<=32;j++) 
      scrn_grid[i][j] = fgetc(fp) - 97; 
     fgetc(fp); // skip CR LF 
     fgetc(fp); // 
    } 
    fclose(fp); 

    for(i=1;i<=20;i++) 
     for(j=1;j<=32;j++) 
      display_item(scrn_grid[i][j],j-1,i-1); 

    return(0); // no error 
} 

Извините за большой код свалки, на самом деле не знаю, что включать и исключать!

+0

Что такое команда, которую вы используете компилировать и связывать все это? Кроме того, у вашего прототипа для 'scrnnrml()' отсутствует тип возвращаемого значения, когда он выглядит так, будто в прототипе должен быть тип 'void'. – rjp

+0

Я использую 'cl nickman.c', если это то, что вы имели в виду? или 'gcc nickman.c' при использовании GNU Хорошо спасибо за эту информацию :) – DNKROZ

+0

Вы тоже не компилируете' screen.c' и 'scrneng.c'? Они содержат некоторые ваши внешние определения символов и должны быть скомпилированы и связаны с 'nickman.c' – rjp

ответ

3

Необходимо указать каждый файл, который вы хотите скомпилировать в командной строке. Если вы дадите только исходный файл, содержащий main, нет никакого способа узнать, где живут другие функции.

Например, если у вас были screen.c и screen_old.c, как с теми же функциями, но (возможно) с различными реализациями, как компилятор мог бы узнать, какой из них использовать?

Вы можете либо скомпилировать каждый из них в отдельности в объектный файл затем связать объектные файлы:

cl -c nickman.c 
cl -c screen.c 
cl -c scrneng.c 
cl -out:nickman nickman.o screen.o scrneng.o 

или скомпилировать и ссылку все сразу:

cl -out:nickman nickman.c screen.c scrneng.c 
+0

Спасибо за это. Теперь это правильно соответствует и раскрывает ряд других ошибок, за которые я могу застрять! – DNKROZ

Смежные вопросы