Błąd LNK2019 przy kompilacji programu z DLL'kami.

0

Witam,

Pracuję w Visual Studio 2013. Po raz pierwszy pracuję z DLL'kami i to dodatkowo napisanymi pod Embarcadero.

Zgodnie z sugestią producenta plik DLL potraktowałem *dumpbin * i lib, aby otrzymać plik LIB.
Wszystkie pliki DEF, DLL, EXP, H, LIB wrzuciłem do jednego katalogu (d:\vb\rcp).
W Visualu, we właściwościach projektu dodałem adres w/w katalogu w pozycje:

  • Configuration Properties -> VC++ -> Incude Directories

  • Configuration Properties -> VC++ -> Library Directories

  • Configuration Properties -> C/C++ -> Additional Include Directories

  • Configuration Properties -> Linker -> General ->Additional Library Directories
    a nazwy DLL'ek dodałem do:

  • Configuration Properties -> Linker -> Input -> Additional Dependencies

Próbuję skompilować przykładowy program dostarczony od producenta:


#include "d:\vb\rcp\common.h"

//#pragma hdrstop

//---------------------------------------------------------------------------

//#pragma argsused
int main(int argc, char* argv[])
{
	SGlobalConfig config;
	SVertList verts;
	SDepartList departs;
	SGroupList groups;
	SWorkerList workers;
	SWorkerDesc worker;

	SMemberFilter filter = { GROUP_FILTER, 1, NULL };

	if (argc < 3)
	{
		printf("\nusage: hierarchy <user> <password>\n"); return 0;
	}

	if (ConnectToServer(argv[1], argv[2]))
	{
		// Nazwa zakładu jest polem konfiguracji globalnej
		biGetGlobalConfig(&config);
		printf("\n%s\n", config.Name);
		// Pobierz wydziały
		if (biGetDeparts(&departs))
		{
			for (unsigned int i = 0; i<departs.Items; i++)
			{
				printf("  %s\n", departs.Data[i].Name);
				// Pobierz grupy dla wydziału
				if (biGetGroups(&groups, departs.Data[i].Number))
				{
					for (unsigned int j = 1; j<groups.Items; j++)
					{
						printf("    %s\n", groups.Data[j].Name);
						filter.Filter = &groups.Data[j].Number;
						// Pobierz pracowników należących do danej grupy
						if (biGetWorkersByMembership(&filter, &workers))
						{
							for (unsigned int k = 0; k<workers.Items; k++)
							{
								worker.Number = workers.Data[k];
								// Pobierz podstawowy opis pracownika
								if (biGetWorkerDesc(&worker))
									printf("      %s %s\n", worker.SurName, worker.FirstName);
							}
							// zwolnij liste
							LocalFree(workers.Data);
						}
					}
					// zwolnij liste
					LocalFree(groups.Data);
				}
			}
			// zwolnij liste
			LocalFree(departs.Data);
		}

		//------------------------------------------------------------------------------
		// To samo dla wydziałow

		filter.Kind = VERT_FILTER;

		biGetGlobalConfig(&config);
		printf("\n%s\n", config.Name);

		if (biGetVerts(&verts))
		{
			for (unsigned int i = 0; i<verts.Items; i++)
			{
				printf("  %s\n", verts.Data[i].Name);
				filter.Filter = &verts.Data[i].Number;
				if (biGetWorkersByMembership(&filter, &workers))
				{
					for (unsigned int k = 0; k<workers.Items; k++)
					{
						worker.Number = workers.Data[k];
						if (biGetWorkerDesc(&worker))
							printf("    %s %s\n", worker.SurName, worker.FirstName);
					}
					LocalFree(workers.Data);
				}
			}
			LocalFree(verts.Data);
		}
	}

	DisconnectFromServer();
	return 0;
}
//---------------------------------------------------------------------------

Jedyna zmiana to #include "d:\vb\rcp\common.h" - dodanie katalogu z plikami.

plik common.h

 
#ifndef commonH
#define commonH
//---------------------------------------------------------------------------

#define BIBIDLL_USE

#include "D:\vb\rcp\bimsg.h"
#include "D:\vb\rcp\bibi10.h"

#include <stdlib.h>
#include <stdio.h>

unsigned int ConnectToServer(char* user, char* password);
void DisconnectFromServer();
void VerboseError();

#endif

plik common.cpp

 
//---------------------------------------------------------------------------

#pragma hdrstop
#include "common.h"
//---------------------------------------------------------------------------


unsigned int ConnectToServer(char* user, char* password)
{
 if(biStartup() != S_OK) printf("Błąd 0x%8X",::GetLastError());
 if(!biCreate(CAI_TEST,BA_PEOPLE | BA_HIERARCHY | BA_CONFIG,0)) { VerboseError(); return 0; }
 if(!biConnect(NULL)) { VerboseError(); return 0; }
 if(!biIsAlreadyLoggedOn())
  {
   if(!biLogin(user,password))
    {
     if (::GetLastError() == ERROR_SUCCESS)
      printf("Błędna nazwa użytkownika lub hasło!\n");
     else // np. nazwa użytkownika (i/lub hasło) za krótka
      VerboseError();
     return 0;
    }
  }

 return 1;
}

void DisconnectFromServer()
{
 biLogout();
 biRelease();
}

void VerboseError()
{
 char buffer[256];
 biFormatMessage(::GetLastError(),buffer,256);
 printf(buffer);
}

Pliki bimsg.h oraz bibi10.h są za duże aby je wklejać.

W czasie kompilacji wyskakują mi błędy:
''
Error 1 error LNK2019: unresolved external symbol __imp__biGetWorkerDesc referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 2 error LNK2019: unresolved external symbol __imp__biGetWorkersByMembership referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 3 error LNK2019: unresolved external symbol __imp__biGetVerts referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 4 error LNK2019: unresolved external symbol __imp__biGetDeparts referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 5 error LNK2019: unresolved external symbol __imp__biGetGroups referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 6 error LNK2019: unresolved external symbol __imp__biGetGlobalConfig referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 7 error LNK2019: unresolved external symbol "unsigned int __cdecl ConnectToServer(char *,char *)" (?ConnectToServer@@YAIPAD0@Z) referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 8 error LNK2019: unresolved external symbol "void __cdecl DisconnectFromServer(void)" (?DisconnectFromServer@@YAXXZ) referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 9 error LNK1120: 8 unresolved externals D:\VB\RCP_v1\Debug\RCP_v1.exe RCP_v1''

Funkcje: biGetWorkerDesc, biGetWorkersByMembership, biGetVerts, biGetDeparts, biGetGroups, biGetGlobalConfig są zadeklarowane w bibi10.h.


#if defined (BIBIDLL_BUILD)
 #define BIBI_DLL __declspec(dllexport)
#else
 #if defined (BIBIDLL_USE)
  #define BIBI_DLL __declspec(dllimport)
 #else
  #define BIBI_DLL
 #endif
#endif

BIBI_DLL unsigned int biGetWorkerDesc(SWorkerDesc* desc);

BIBI_DLL unsigned int biGetWorkersByMembership(const SMemberFilter* filter, SWorkerList* workers);

BIBI_DLL unsigned int biGetVerts(SVertList* verts);

BIBI_DLL unsigned int biGetDeparts(SDepartList* departs);

BIBI_DLL unsigned int biGetGroups(SGroupList* groups, unsigned short depart);

BIBI_DLL unsigned int biGetGlobalConfig(SGlobalConfig* config);

Funkcje: ConnectToServer, DisconnectFromServer są zadeklarowane w common.h.

Próbowałem kilku rozwiązań, które mi się nasuwały:

  • dodałem pliki H do sekcji Header files.

  • próbowałem konstrukcji:

extern "C" {
#include "D:\vb\rcp\bimsg.h"
#include "D:\vb\rcp\bibi10.h"
}

Niestety, nic to nie dało.

Proszę o pomoc.

Krzysiek

0

a nazwy DLL'ek dodałem do:

Configuration Properties -> Linker -> Input -> Additional Dependencies

Nie nazwy dllek, tylko libek, z rozszerzeniem .lib

0

Oczywiście, że pliki LIB. I takie też są umieszczone. Mój tekst "nazwy DLLek" to był daleko idący skrót myślowy.

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