Я получаю ошибку 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
}
Извините за большой код свалки, на самом деле не знаю, что включать и исключать!
Что такое команда, которую вы используете компилировать и связывать все это? Кроме того, у вашего прототипа для 'scrnnrml()' отсутствует тип возвращаемого значения, когда он выглядит так, будто в прототипе должен быть тип 'void'. – rjp
Я использую 'cl nickman.c', если это то, что вы имели в виду? или 'gcc nickman.c' при использовании GNU Хорошо спасибо за эту информацию :) – DNKROZ
Вы тоже не компилируете' screen.c' и 'scrneng.c'? Они содержат некоторые ваши внешние определения символов и должны быть скомпилированы и связаны с 'nickman.c' – rjp