Fórum Root.cz
Hlavní témata => Windows a jiné systémy => Téma založeno: Jeded Vojka 22. 06. 2018, 11:24:14
-
Občas si něco střihnu ve VS2008 na W7 32 bit (no problem) a teď jsem toto prostředí nainstaloval na W10 64 bit. A tam pořád mi to při kompilaci píše: LNK2001"unresolved external symbol ... něco blabla imp ... mraky impů"
Ten samej projekt je úplně v pohodě na těch sedmičkách, a dokonce to samý na těch desítkách mi v klidu sestaví VS 2005.
Takže si myslím, že to bude spíš problém toho prostředí, než chyba někde v kódu.
Shell32.lib do additional dependencies jsem zkoušel doplnit, vypnout nějaký to 64bit testování taky, parametr linkeru Zi, Zl, jsem taky zkoušel - všechno bez úspěchu. Pořád LNK2001. Do adresářů "include" a "lib" jsem doplnil všechny možné knihovny a "h" soubory, stdio.h, stdlib.h tam mám - prostě tam je všechno :o. "Directories" mám nastavený. Už fakt nwm, co s tím.
-
Podle mě, ti chybí v systému knihovny, konkrétně jejich správné verze.
Hledej něco takového:
Microsoft Visual C++ 2005 Redistributable Package
Microsoft Visual C++ 2008 Redistributable Package
a pod.
-
Neco podobneho jsem resil na 64bitovych Win7 a skoncil jsem tak, ze jsem nainstaloval WinXP Mode (proste tu jejich 32bitovou virtualku WinXP) a delal to v tom. Je to zbabele reseni, ale me to pro danou zakazku stacilo.
-
Já myslím, že Redistributable Package je potřebný pro spuštění už sestavené aplikace na systému, kde není stejné Visual Studio. Ne k samotnému sestavení aplikace.
-
Podle mě, ti chybí v systému knihovny, konkrétně jejich správné verze.
Hledej něco takového:
Microsoft Visual C++ 2005 Redistributable Package
Microsoft Visual C++ 2008 Redistributable Package
a pod.
R. Package jsem taky zkoušel, nainstaloval, restartoval, spustil, nic.
-
Takže - nejde o problém s kompilací, ale s linkováním. Použití metody pokus/omyl při hlášce linkeru "unresolved external symbol" není vůbec dobrý nápad. Náhodné matlání s Shell32.lib je čistá ztráta času.
Kousek za touto hláškou je napsáno přesně, co ten linker nemůže najít - nejspíš to bude funkce (a za ní bude jméno funkce odkud tu chybějící voláš).
Bohužel tuto klíčovou informaci jsi z chybové hlášky odmazal :(
-
Pokud nenapíšete alespoň příklady funkcí, které linker nenajde (unresolved externals), asi se nedopátráme toho, které knihovny vám chybí (či kterých máte špatné verze).
Pokud by se jednalo o běhovou knihovnu, můžete ji linkovat staticky. V souladu s MS licencí to myslím není, ale pokud se jedná o nástroj čistě pro vaši potřebu, neřešil bych to.
Pak je tu samozřejmě ještě otázka, zda-li máte důvod používat takto staré verze Visual Studia. Nestálo by za to projekt převést do verze 2017?
-
X14, Martin Dráb:
Týkalo se to standardních win API funkcí -
CreatePen
DeleteObject
BeginPaint
EndPaint
srand (GetTickCount())
SetTimer
takovýhle věci to dalo do těch "impů" a neudělá mi to spustitelný .exe soubor.
-
Špatná napevno zadaná plná cesta ke knihovnám (v rámci nastavení solution ve VS)?
Například "C:\Program Files\Microsoft Visual Studio...", namísto "Program Files (x86)" pro 32bitovou verzi a podobně.
-
Hned bych zkontroloval, zda není náhodou zapnuté Ignore All Default Libraries (/NODEFAULTLIB).
I s tím se to dá provozovat, ale pak je zapotřebí ručně nařídit import i takové "samozřejmosti" jako Kernel32.lib.
BTW Není potřeba to dopisovat do nastavení projektu, stačí do nějakého .cpp někam přidat následující zaklínadla. Někdy to má své výhody.
#pragma comment(lib,"Kernel32.lib")
#pragma comment(lib,"Gdi32.lib")
-
Hned bych zkontroloval, zda není náhodou zapnuté Ignore All Default Libraries (/NODEFAULTLIB).
I s tím se to dá provozovat, ale pak je zapotřebí ručně nařídit import i takové "samozřejmosti" jako Kernel32.lib.
BTW Není potřeba to dopisovat do nastavení projektu, stačí do nějakého .cpp někam přidat následující zaklínadla. Někdy to má své výhody.
#pragma comment(lib,"Kernel32.lib")
#pragma comment(lib,"Gdi32.lib")
Jo, x14 - dík. Já mám pocit, že to tam je, to "nodefautlib" nastavené. Ntb s těmi W10 jsem nechal doma a teď jsem ještě v práci, takže nemám přesný popis, ale určitě to vyzkouším. Případně sem zítra písnu, a ještě se poradil. :D
-
Tak to pozor, nodefautlib je opravdu hardcore volba. Nejde ani tak o to, že pak chybějí funkce z kernel32, user32, gdi32...
Ale hlavně tam není ani žádný runtime msvcrt.lib (pro C) a msvcp.lib (pro C++).
A to se pak dějí věci - NIC nefunguje! Chybí "entry point" - nikdo nezavolá winmain, nefungují floaty, globální proměnné nejsou přiřazené/nemají zavolané konstruktory, ...
Má to smysl asi jen pro pro dva speciální případy:
- Generování co nejkratšího exáče z MSVC (dá se dostat na jednotky KB)
- Eliminace něčeho, co je před WinMainem (např. natvrdo nastavené HeapSetInformation s HeapEnableTerminationOnCorruption, které už se nedá nikdy odvolat)
----------------------
P.S.: Samo se to tam určitě nenastavilo ;)
-
x14: jo, tak teď už jsem doma. Takže: ignore default libraries mám "no" :'(
Celý chybový výpis vypadá takhle:
1>------ Build started: Project: HP50GTTRS, Configuration: Release Win32 ------
1>Compiling...
1>cl : Command line warning D9035 : option 'Wp64' has been deprecated and will be removed in a future release
1>HP50GTTRS.cpp
1>.\HP50GTTRS.cpp(112) : warning C4996: '_swprintf': This function or variable may be unsafe. Consider using _swprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.
1> C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\wchar.h(773) : see declaration of '_swprintf'
1>.\HP50GTTRS.cpp(221) : warning C4996: '_swprintf': This function or variable may be unsafe. Consider using _swprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.
1> C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\wchar.h(773) : see declaration of '_swprintf'
1>Linking...
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__DispatchMessageW@4
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__CreateSolidBrush@4
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__DefWindowProcW@16
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__SendMessageW@16
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__CreatePen@12
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__CreateWindowExW@48
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__IsWindow@4
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__ShowWindow@8
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__RedrawWindow@16
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__EndDialog@8
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__Rectangle@20
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__CreateCompatibleBitmap@12
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__LoadIconW@8
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__CreateCompatibleDC@4
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__RegisterClassExW@4
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__TranslateMessage@4
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__GetDC@4
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__SelectObject@8
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__DeleteObject@4
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__BeginPaint@8
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__GetClientRect@8
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__LoadCursorW@8
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__DeleteDC@4
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__DialogBoxParamW@20
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__KillTimer@8
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__PostQuitMessage@4
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__GetMessageW@16
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__SetTimer@16
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__BitBlt@36
1>HP50GTTRS.obj : error LNK2001: unresolved external symbol __imp__EndPaint@8
1>D:\Pracovna\_MSVS 2008 My Projects\HP50G\HP50GTTRS\Release\HP50GTTRS.exe : fatal error LNK1120: 30 unresolved externals
1>Build log was saved at "file://d:\Pracovna\_MSVS 2008 My Projects\HP50G\HP50GTTRS\Release\BuildLog.htm"
1>HP50GTTRS - 31 error(s), 3 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
-
Tak SetTimer, TranslateMessage, ShowWindow, atd. jsou z User32.lib, čili přidat do linkování, a mělo by to chodit..
-
Tak SetTimer, TranslateMessage, ShowWindow, atd. jsou z User32.lib, čili přidat do linkování, a mělo by to chodit..
Přidáno User32.lib - bez efektu .. :'(
-
Ještě jsem si něčeho všimnul. Pokud je to opravdu projekt pro VS2008, tak je podezřelé, že se načítají hlavičkové soubory z adresáře "C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include", protože to je cesta k VS2005.
Asi to ty správné knihovny hledá na nesprávném místě.
-
Honza: to jsem tam dal "ze zoufalství" cestu i k dalším adresářům. Jinak tam je standartně C:\Program Files (x86)\Microsoft SDKs\Windows\v5.0\Include
-
Spíš se podívejte, odkud jsou načítány knihovny (např. user32.lib). Funkce, co vám chybí, jsou tu s námi snad už od WIndows 2000 (max. XP), takže je celkem jedno, zda-li použijete hlavičky z MSVS 2005 či MSVS 2008. A podívejte se také dovnitř do těch .lib souborů, jaké názvy funkcí v sobě (ne)obsahují.
Název knihovny pro danou funkci najdete v MSDN (je tam dole tabulka, která udává, v které DLL knihovně a kterém LIB souboru je ta funkce uvedená).
Případně můžete projekt zkusit vytvořit znovu. Obvykle to nebývá moc obtížné – prostě do něho přidáte soubory se zdrojáky a provedete pár drobných změn v nastavení (include paths, library paths...) a je hotovo.
-
Martin Dráb: knihovny se načítají odtud: C:\Program Files (x86)\Microsoft SDKs\Windows\v5.0\Lib\IA64
Projekt jsem zkoušel znovu od začátku sestavit, New, Project, Win32Application, empty project, přidal jsem tam ten svůj .cpp kód a pořád nic.
-
IA64
Ten program kompilujete pro Itanium? Protože ty knihovny zřejmě pro Itanium budou.
V podadresáři x86 by měly být 32bitové knihovny v x64 (nebo amd64) by měly být 64bitové.
-
Martin Dráb: já ani nevím, co to "itanium" vůbec je. V noťasovi je i5 7200U. Nicméně - už to sviští ..
Prostě z tý "2005", která linkovala úpe bez problémů jsem zkopčil jeden z adresářů, kam sahala pro knihovny.
$(VCInstallDir)PlatformSDK\lib
a nacpal to té "2008".
Ale každopádně díky všem za info, navedli jste mě na "pravou cestu".
-
Kopírování není zrovna vhodný způsob. Přímo VS2008 neporadím. Nicméně:
VS2005 má odkazy na knihovny globálně, v
menu Tools -> Options -> rozbalí se okno "Options" a v něm vlevo:
"Project and Solutions" -> "VC++ Directories" a vpravo vybrat Platform "Win32", show directories for "Library files" a tam by měl být seznam stylu
$(VCInstallDir)lib
$(VCInstallDir)PlatforSDK\lib
...
a podobně, tak tam doplnit správnou cestu
VS2010 už to nemá v globálním nastavení, ale má to u solution (IMHO vhodnější). Pokud na názvu projektu u otevřeného solution dáte pravé tlačídko a "Properties" tak vybrat:
"Configuration Properties" -> "VC++ directories" a vpravo pak "Library Directories" a tam by měl být seznam stylu
$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib
a podobně, tak tam doplnit správnou cestu
VS2008 bude někde mezi tím, někde poblíž či jedno z toho.