Witam!
Mam problem bo zrobiłem program w konsoli - wszystko ładnie działa ale będę musiał go zaprezentować w szkole więc postanowiłem go wypróbować na innym komputerze - dałem F7 ( build solution ) i wziąłem ten plik .exe. Ale jak się można było spodziewać program nie dołączył bibliotek więc na innym komputerze nie działa. Jak zrobić aby je dołączył?
Bo ja wchodzę w opcje projektu - configuration proporties - c/c++ - code generation - i runtime library ustawiam z multi-threaded Debug DLL (/MDd) na Multi-threaded (/MT) jak gdzieś pisali ale wtedy przy kompilacji wywala mi masę błędów - co zrobic ?
Lepiej będzie jak ściągniesz i zabierzesz ze sobą: http://www.microsoft.com/download/en/details.aspx?id=5555
Jeżeli wiesz, że na pewno nie będzie można zainstalować tej paczki to dopiero zastanów się nad statycznym linkowaniem runtime.
Zależy z jakiej wersji visuala korzystasz. Jeżeli to 2010 można ominąć instalacje tego co podał Rev i w folderze z aplikacją dodajemy 3 pliki: msvcr100.dll, msvcp100.dll oraz Microsoft.VC100.CRT.manifest.
Zawartość pliku manifest:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<file name="msvcr100.dll"/>
<file name="msvcp100.dll"/>
</assembly>
Oczywiście na komputerze musi być zainstalowany net framework 4.0
Niestety nie działa :(
Jak zrobić żeby do programu były dołączone wszystkie potrzebne biblioteki ?
Wiem, że kiedyś mi się to udało tylko coś w ustawieniach w VS trzeba było zrobić
nie działa bo kompilowales pod wersję debug a nie release.
Build > Build configuration (chyba, wiem że na końcu menu) > tam zaznacz release i build. Teraz wszystko powinno działać
Mam ten sam problem. Niestety rozwiązanie z podanego linku nie działa. Zaznaczam, że ustawienia Debug czy Release nic nie zmieniają.
A może trzeba zmienić w Configuration manager...
solution'a, nie wiem jak jest w VC++, ale w VC# trzeba zmienić właśnie tam na Release żeby działało.
xeo545x39 napisał(a)
A może trzeba zmienić w
Configuration manager...
solution'a, nie wiem jak jest w VC++, ale w VC# trzeba zmienić właśnie tam na Release żeby działało.
O tym mówiłem :) Gdy ustawię wszystko tak jak opisane, dostaję błąd:
Command line error D8016: '/clr' and '/MT' command-line options are incompatible
Gdy wyłączę CLR:
LIBCMT.lib(wwincrt0.obj) : error LNK2019: unresolved external symbol _wWinMain@16 referenced in function ___tmainCRTStartup
Byłbym bardzo wdzięczny za pomoc. Niestety przeszukiwanie googla nic nie dało.
Wiesz ja kiedyś tez chciałem wrzucać wszystko do exe ale w końcu zrezygnowałem. Jeżeli użyłeś coś .net to będzie żądał clr. Każdy kto tu pisze o problemie nie podaje jednej ważnej rzeczy: jaka wersja visuala? A wbrew pozorom jest to ważne. Wiec powiem co wiem. Jeżeli używasz visual 2008 to najlepiej zmienić net na wersje 2.0 (wątpię, że w drobnym programie używasz funkcji z wyższej wersji) Project-> <nazwa> Properties -> framework and references i masz po lewej combobxa z możliwością zmiany. Na komputerze gdzie ma zostać uruchomiany program instalujesz http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=29 (jeżeli windows ma wł aktualizacje to nie powinno być problemu bo powinno już być dawno zainstalowane). w przypadku 2010 w wersji EE nie ma możliwości zmiany net frameworka, przymusowo jest wersja 4 wiec program będzie mógł być uruchomiony na wind xp sp3/vista sp1/7 oczywiście z zainstalowanym net framework 4 (który jednak jeszcze dość rzadko ludzie instalują) no i oczywiście (dla programow zrobionych na visualu bez sp1) http://www.microsoft.com/download/en/details.aspx?id=5555 lub http://www.microsoft.com/download/en/details.aspx?id=8328 (visual z sp1).
mr_jaro napisał(a)
Każdy kto tu pisze o problemie nie podaje jednej ważnej rzeczy: jaka wersja visuala?
Używam Visual C++ 2010 Express. Wydaje mi się, że nie używam żadnych dodatkowych funkcjonalności .NET. Ba, nawet jestem pewien ;)
Piszę jedynie proste programiki w czystym C++ . Jeśli nie ma możliwości statycznego linkowania to chyba zmieniam kompilator.
Po pierwsze primo, musisz się zdecydować, czy aplikacja ma być konsolowa czy nie, i czy ma korzystać z .Net czy nie.
Dla normalnej aplikacji konsolowej przy tworzeniu projektu należy wybrać Win32 Console Application.
Wtedy program nie będzie korzystać z Frameworka oraz nie będzie problemu z funkcją main().
Później w opcjach projektu możesz wybrać, czy runtime ma być linkowane statycznie do exe czy być w osobnej DLL-ce. Jeśli runtime jest w DLL to wtedy program wymaga zainstalowania pakietu „Redistributable”, albo ręcznego skopiowania używanych dll-ek.
Rozwiązanie z Redistributable ma taką zaletę, że te biblioteki podlegają aktualizacji przez Windows Update, co ma się rozumieć nie będzie miało miejsca przy linkowaniu statycznym ani ręcznym dorzuceniu dll-ki.
ręcznym dorzuceniu dll-ki.
W linkowaniu statycznym faktycznie, ale w przypadku ręcznie dołączonych bibliotek, WinSxS przekieruje te biblioteki na te ewentualnie zaktualizowane.
Podsumowując, aby skompilować program do uruchamiania w systemie bez frameworka należy:
-
typ projektu WIN32 Console Application
-
ustawić konfigurację na Release
-
w zakładce 'General' przy opcji 'Use of MFC' ustawić 'Use MFC in a Static Library'
-
w zakładce 'Code generation' przy opcji 'Runtime Library' ustawić na MT
Mi nie chciało kompilować, z powodu źle wybranego typu projektu (dawałem CLR Console).
jeśli nie używasz MFC (a jak nie wiesz to nie używasz) to ustawienie MFC nie ma znaczenia - a może nawet zaszkodzić, bo jak linker dowali ci całe MFC statycznie to ci się zrobi exek na kilka mega.