Я пытаюсь собрать этот проект , который в основном является экстрактором для определенных c файлов .rom. Как человек с почти нулевым опытом в кодировании, у меня одна проблема за другой, пытаясь создать его.
В описании проекта говорится, что для его создания требуется zlibstat.lib из zlib, поэтому я получил последнюю версию zlib, открыл его на VS2019, следовал этим инструкциям и собрал все, включил требуемый zlibstat.lib.
После открытия sln проекта и выяснения, куда поместить файлы, связанные с zlib, я пытался собрать, но это дало мне эту ошибку в fs.obj: «LNK2019: неразрешенный внешний символ _uncompress, на который ссылается функция» int __cdecl run_extract (char *) "(? run_extract @@ YAHPAD@Z)". Вот как далеко меня привели Google и две мои клетки мозга.
Я не совсем уверен, что мне делать, чтобы решить эту проблему, но, очевидно, это как-то связано с функцией run_extract:
fs.h
#pragma once
#include <iostream>
#include <fstream>
#include "defs.h"
#include <zlib.h>
#pragma comment(lib, "zlibstat.lib")
#include <shlwapi.h>
#pragma comment(lib,"shlwapi.lib")
int run_extract(char *);
и фс. cpp
int run_extract(char *path)
{
std::fstream test;
test.open(path, std::ios::in | std::ios::binary);
if (!test) return -1;
size_t file_size;
test.seekg(0, std::ios::end);
file_size = test.tellg();
test.seekg(0, std::ios::beg);
unsigned char *buffer = new unsigned char [file_size];
test.read((char*)buffer, file_size);
test.close();
jrm_rom_header *ptrHeader = (jrm_rom_header*)buffer;
unsigned long indexLen = ptrHeader->count_index * sizeof(jrm_rom_file_index);
unsigned char *index = new unsigned char [indexLen];
uncompress(index, &indexLen, (const Bytef*)(buffer + ptrHeader->pos_index), ptrHeader->size_index); // use zlib
jrm_rom_file_index *ptrIndex = (jrm_rom_file_index*)index;
unsigned char key = 0;
char *path_out = new char[0x100];
unsigned long ypos = 0, x = 0;
for (x = 0; x<ptrHeader->count_index; x++)
{
key = (ptrIndex->key & 0xff) ^ (ptrIndex->key >> 8 & 0xff) ^ (ptrIndex->key >> 16 & 0xff) ^ (ptrIndex->key >> 24 & 0xff);
get_file_path(path_out, ptrIndex->file_path);
// printf("%04d: file_name = %s\n file_start = 0x%08x, file_size = 0x%08x, key = 0x%02x\n", x, path_out, ptrIndex->pos_start, ptrIndex->size_file, key);
printf("%s: %d bytes.\n", path_out, ptrIndex->size_file);
for (ypos = 0; ypos < ptrIndex->pos_delta; ypos++)
buffer[ypos + ptrIndex->pos_start] ^= key;
try_create_directory(path_out);
test.open(path_out, std::ios::binary | std::ios::out);
test.write((char*)buffer + ptrIndex->pos_start, ptrIndex->pos_delta);
test.close();
ptrIndex++;
}
delete[]path_out;
delete[]index;
delete[]buffer;
return 0;
}
Я думал, что проблемы исчезнут go, если я буду использовать ту же версию Visual Studio, что и проект, поэтому я установил Visual C ++ 2008 и более старую версию zlib , только чтобы получить ту же самую ошибку.
Извините, если я веду себя глупо и плохо написала всю эту ситуацию.