Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Visual C++ Link FAQ

[es] :: C/C++ programiranje :: Visual C++ Link FAQ

[ Pregleda: 6845 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16220
*.verat.net



+7026 Profil

icon Visual C++ Link FAQ16.04.2002. u 22:52 - pre 237 meseci
Posto se vec nekoliko puta javila potreba za objasnjenjem nekih fundamentalnih pitanja u vezi VisualStudio linkera, problema poput "unresolved external" simbola, itd.. pokusacu da ovde napisam jako lak FAQ za neke osnovne greskice u linkovanju.


DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16220
*.verat.net



+7026 Profil

icon Re: Visual C++ Link FAQ16.04.2002. u 23:04 - pre 237 meseci
Issue #1 - "LNK2001: Unresolved External XXX()" za Win32 API funkcije"

Ovo je jako cest pocetnicki problem kod pisanja Win32 aplikacija koje koriste advanced Win32 API. Naime, sve Win32 API funkcije su implementirane u Win32 DLL fajlovima (dobro.. neke se mapiraju na native kernel - tj. win32k.sys, ali to nije tema za FAQ ;), ciji su exporti definisani u tzv. "import" bibliotekama. Import biblioteke sadrze tacne podatke u kom DLL fajlu su implementirane funkcije.

Postoji i drugaciji nacin pozivanja Win32 funkcije iz dinamicke biblioteke - kroz tzv. "dinamicko" ucitavanje - ali ovo nije bas prakticno za sve upotrebe, i komplikovanije je. Za vecinu primena je staticko linkovanje sa import bibliotekama najbolje resenje jer ucitavanje DLL fajla u memoriju i mapiranje adresa radi Win32 kernel a ne programer.

Default setovanja VC++ linkera ukljucuju CRT biblioteku i kernel32.lib (elementarne Win32 kernel funkcije) - ostale Win32 funkcije ce zahtevati dodavanje odgovarajucih biblioteka.

Dakle, vi kompajlirate program - i dobijete nesto tipa:


Code:

moj_object.obj : error LNK2001: unresolved external symbol _CreateToolbarEx()


Sta sad? U kojoj import biblioteci se nalazi CreateToolbarEx() funkcija?

Evo prostog nacina za nalazenje funkcija:

Step #1: U MSDN-u je potrebno naci opis te funkcije, kroz search. Kada pronadjete opis funkciju, na dnu opisa ce pisati nesto nalik na:


Citat:

Requirements
Windows NT/2000: Requires Windows NT 3.51 or later
Windows 95/98: Requires Windows 95 or later
Header: Declared in commctrl.h.
Import Library: comctl32.lib.



Nama je od vaznosti poslednja stavka (Import Library) - to je biblioteka u kojoj se nalazi opis linka na tu Win32 funkciju.


Step #2: Ako koristite VisualStudio Project, u Project Settings dijalogu (Project / Settings... ili Alt+F7 u default VC6 konfiguraciji) dodajte vasu biblioteku:





Step #3: Iskompajlirajte vas projekat - unresolved external je proslost.

Poenta cele price je znati koristiti MSDN dokumentaciju, u kojoj je sve jasno i koncizno napisano.

U komandnoj liniji je potrebno library navesti kao parametar linkeru:


Code:

cl.exe mojfajl.c -link comctl32.lib



DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16220
*.verat.net



+7026 Profil

icon Re: Visual C++ Link FAQ16.04.2002. u 23:26 - pre 237 meseci
Issue #2 - "LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library"

Umesto LIBC, moze da stoji LIBCD, LIBCMT, LIBCMTD, MSVC(i)RT(d), itd..

Ovo je isto jedan od "klasicnih" problemcica - neki fajlovi ili biblioteke u projektu koriste razlicitu CRT (C RunTime) biblioteku.

Savet: Nikada ali bas NIKADA ne mesajte CRT biblioteke u istom executable fajlu. Problemi koji mogu nastati krecu se od prostog krahiranja aplikacije do jos gorih - problema koji se na prvi pogled ne vide, ali ko zna kad mogu da postanu bitni.

Vecina korisnika odmah poslusa "savet" linkera i stavi /NODEFAULTLIB (ili /NOD) u linker settings i ne samo da ne resi problem, vec dobije stotine "nerazjasnjenih" simbola (unresolved externals) - zato sto linker ne zna gde da trazi CRT (i druge) funkcije za linkovanje. Dakle... resenje je malo drugacije.

Procesljajte sve .c fajlove i sve embeddovane staticke lib fajlove (tj. njihove projekte) i budite sigurni da ste checkirali ISTU CRT biblioteku:

LIBC - staticka CRT za single-thread aplikacije
LIBCMT - staticka CRT za multithreaded aplikacije
MSVCRT - dinamcika (u DLL fajlu) za multithreaded aplikacije

Sufiks "d" znaci da je u pitanju debug, a ne release verzija bibliotke.





Za ljubitelje komandne linije, kao parametar kompajleru je potrebno navesti nesto od sledecih opcija:

Code:

/MD link with MSVCRT.LIB
/ML link with LIBC.LIB
/MT link with LIBCMT.LIB
/MDd link with MSVCRTD.LIB debug lib
/MLd link with LIBCD.LIB debug lib
/MTd link with LIBCMTD.LIB debug lib


DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Smotanko
John Smith

Član broj: 45975
Poruke: 4
*.ptt.yu.



Profil

icon Re: Visual C++ Link FAQ23.01.2005. u 03:46 - pre 203 meseci
Vec neko vreme mi se u Visual C++ 6.0 pojavljuju pet gresaka kada probam da otvorim i startujem hello.cpp ili hellodlg.cpp.Kada sam ih radio u MFC radili su dobro a kad zatvorim VC++ 6 pa ga opet otvorim on ih kompajlira bez greske a kad treba da ih pokrene prijavljuje greske:
helloDlg.obj : error LNK2001: unresolved external symbol "protected: void __thiscall CHelloDlg::OnHello(void)" ([email protected]@@IAEXXZ)
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
libcd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/helloDlg.exe : fatal error LNK1120: 4 unresolved externals
Error executing link.exe.

helloDlg.exe - 5 error(s), 0 warning(s)

Prost kod programa Hello world izgleda ovako nekako:

#include "stdafx.h"
#include "hello.h"
#include "helloDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CHelloApp

BEGIN_MESSAGE_MAP(CHelloApp, CWinApp)
//{{AFX_MSG_MAP(CHelloApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHelloApp construction

CHelloApp::CHelloApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CHelloApp object

CHelloApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CHelloApp initialization

BOOL CHelloApp::InitInstance()
{
AfxEnableControlContainer();

// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.

#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif

CHelloDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}

// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}

Prvenstveno me interesuje :error LNK2001: unresolved external symbol _main.
Ako bi neko mogao da mi objasni sta je greska?
 
Odgovor na temu

[es] :: C/C++ programiranje :: Visual C++ Link FAQ

[ Pregleda: 6845 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.