problem z biblioteką msvcp100.dll

0

Witam, napisałem u siebie kod w C++, w MS VisualStudio 2012 pod Win8. Problem jest tego typu, że uruchamiając program na innym komputerze wyświetla się komunikat o braku pliku MSVCP100.DLL, nie wiem jak temu zaradzić, program jest bardzo prosty, więc raczej nie powinien wymagać dodatkowych rzeczy.
Oto kod:

//#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
#include <cstdlib>

using namespace std;

string tab_text[2048], nazwa;
string imie = "Imie", nazwisko = "Nazwisko", album = "123456", grupa = "grupa1";//dane personalne

void wyswietl(int poczatek, int koniec, int info){
	system("CLS");
	cout << album << " " << nazwisko << " " << imie << " " << grupa << endl;
	cout << nazwa << endl;
	cout << "ESC - wyjscie z programu | STRZALKA W DOL - linia w dol | SPACJA - okno w dol"<< endl;
	if(info == 1) cout << "NIEPOPRAWNA ILOSC ARGUMETOW PROGRAMU";
	else if(info == 2) cout << "BLAD PRZY OTWIERANIU PLIKU";
	else{
		cout << endl << endl << endl << endl;
		for(int i=0; i<12; i++) cout <<" ";
		for(int i=0; i<56; i++) cout <<"*";
		cout << endl;
		string linia;
		for(int i=poczatek; i<koniec && i<2048; i++){
			for(int j=0; j<12; j++) cout <<" ";
			cout << "* ";
			linia = tab_text[i].substr(0, 52);
			if(linia.length() > 51) linia = tab_text[i].substr(0, 51) + ">";
			cout << linia;
			for(int j = 52 - linia.length(); j>0; j--) cout << " ";
			cout << " *" << endl;
		}
		for(int i=35-(koniec-poczatek); i>0; i--){
			for(int j=0; j<12; j++) cout <<" ";
			cout << "*";
			for(int j=0; j<54; j++) cout <<" ";
			cout << "*" << endl;
		}
		for(int i=0; i<12; i++) cout <<" ";
		for(int i=0; i<56; i++) cout <<"*";
	}
}

string wyluskaj_nazwe(string sciezka){

	int znaleziony = sciezka.find_last_of("/\\");
	return sciezka.substr(znaleziony+1);
}

int main(int argc, char* argv[]){

	HANDLE uchwyt = GetStdHandle(STD_OUTPUT_HANDLE);
	SMALL_RECT wymiary = {0,0,79,49};

	if(!SetConsoleWindowInfo(uchwyt, true, &wymiary)) cout << "nie udalo sie ustawic rozmiaru konsoli :(" << endl;

	if(argc == 2){ 
		nazwa = wyluskaj_nazwe(argv[1]);

		ifstream plik(argv[1]);
		if(plik.is_open()){
			int koniec = 35, poczatek = 0;
			for(int i=0; plik.good() && i < 2048; i++)
				getline(plik, tab_text[i]);

			wyswietl(poczatek, koniec, 0);
			while(1){
				if(GetAsyncKeyState(VK_DOWN)){
					poczatek++;
					koniec++;
					wyswietl(poczatek, koniec, 0);
				}
				else if(GetAsyncKeyState(VK_SPACE)){
					poczatek = koniec;
					koniec += 35;
					wyswietl(poczatek, koniec, 0);
				}
				else if(GetAsyncKeyState(VK_ESCAPE)) break;				
			}
		}
		else wyswietl(0, 0, 2); //blad otwarcia pliku
	}
	else wyswietl(0, 0, 1); //blad ilosci argumentow

	return 0;
}

Proszę o pomoc, dzięki z góry

0

Programy skompilowane przez Visual C++ wymagają tego: http://www.microsoft.com/en-us/download/details.aspx?id=5555

0

Czyli jeśli w treści zadania mam napisane, że program ma być skompilowany i napisany w Visual C++ to nie jest to błędem za które może nie zostać zaliczone zadanie?

0

Nie jest to błędem.

0

Okej, dzięki;)

0

Alternatywnie możesz też wkompilować wszystko do pliku EXE to program nie będzie wymagać dll'ki - w opcjach projektu zmień ... yy nie pamiętam. Opcja nazywa się coś a'la "Runtime Library" i są do wyboru 4 pozycje:

  • MT
  • MT debug
  • MT DLL
  • MT debug DLL
    Dla konfiguracji "Release" wybierz "MT" zamiast "MT DLL" i jak komuś będziesz wysyłać exe to skompiluj go w trybie "Release".
0

Nie powinno się niczego linkować statycznie, jeżeli nie ma się ku temu naprawdę dobrego powodu. Statyczne zlinkowanie runtime powoduje, że w przypadku wykrycia w nim luki bezpieczeństwa twój program narażony będzie do czasu jego ponownego wydania przez ciebie. W przypadku linkowania dynamicznego poprawka wydana przez Microsoft zadziała dla wszystkich aplikacji (nawet jeżeli wadliwa dllka wciąż będzie w katalogu twojego programu).

Jeżeli tak bardzo chcesz się pozbyć zależności od runtime C++ to nie używaj go. Jest to na tyle prosty program, że spokojnie można go napisać używając samego runtime C i skompilować program przez MinGW albo kompilator Microsoftu z Windows Driver Kit, które domyślnie linkują z systemowym runtime C (msvrt.dll).

0

Świecka prawda @Rev
Ale właśnie w tym przypadku (program na zaliczenie) uzasadnione jest linkowanie statyczne można olać kwestie bezpieczeństwa na rzecz wygody.

0

Z drugiej strony, dynamiczne linkowanie oznacza, że poprawka Microsoftu może zepsuć nam program (jeśli nieświadomie polegaliśmy na bugu).

0

Z trzeciej strony poprawka może wprowadzić nowy bug bezpieczeństwa :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1