[VS.NET/C++] Code delen tussen projecten binnen solution

Pagina: 1
Acties:

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Beste mensen, wat is volgens jullie de juiste manier om binnen de VS.NET IDE het volgende te realiseren:

Ik heb een client/server-applicatie in 1 "solution". Hierin heb ik momenteel 2 "projecten", een Client project en een Server project, die beide een aparte executable moeten opleveren. Alhoewel deze projecten voor het grootste deel verschillende bestanden nodig hebben, bestaat er een overlap van een klein aantal klassen, functies en typen, laten we dit de Shared classes noemen.

Nu wil ik mijn solution zo indelen, dat zowel het Client als het Server-project gebruik kunnen maken van deze Shared classes. Hoe krijg ik dit correct voor elkaar?


Het volgende geldt ook voor de Client, maar ik neem nu de Server als voorbeeld.

Mijn poging was als volgt: Ik heb naast de Client en Server projecten nog een derde project Shared toegevoegd, die als library (.lib) wordt gelinkt (alhoewel dit voor mij geen vereiste is, direct tegen de .obj-files van het Shared-project linken is ook prima wmb). Ik wil echter niet elke .obj-file van het Shared-project apart hoeven specificeren in het Server-project. Elk van deze projecten heb ik in een aparte directory gezet binnen de solution-directory (dit leek me wel zo overzichtelijk).

Het Server-project included header-files uit het Shared-project; het compilen gaat goed, voor alledrie de projecten. Met het linken van de Server mist de linker echter de symbolen die in het Shared-project worden geimplementeerd. Ik heb toen geprobeerd om het Shared-project een dependency te maken van de Server, dit resulteert erin dat het Shared-project als eerste wordt gebuild, maar de linker blijft klagen.

Nu heb ik in het Server-project aangegeven dat de .lib van het Shared-project meegelinkt moet worden (Linker/Input/Additional dependencies = <lib-file>), maar de linker blijft klagen. Misschien moet ik de gebruikte Shared-symbolen nog op een of andere manier exporteren ofzo?


Wie kan mij wegwijs maken?
Alvast bedankt.

  • J27
  • Registratie: Januari 2003
  • Laatst online: 12-05 23:53

J27

Ikzelf doe het als volgt ik heb 2 solutions namelijk de Server en de Client
En bij zowel de server als bij de client voeg ik het project sharedClasses toe, inderdaad de buildorder/dependencies goed zetten en het werkt.

Meestal heb ik 2 IDE's open voor elke solution 1 en dat blijkt goed te werken, als ik de sharedClasses bij de Server aanpas, krijg ik als ik alt-tab naar de client de vraag of ik de aangepaste files ook in dit project in wil laden.

Misschien te simpel gedacht en begrijp ik je vraag niet 100%, maar deze manier werkt voor mij ok. 8)

mijn folder structuur is:

-Server(Dir)
----server.sln (bestaat uit server.csprj en sharedClasslib.csprj)
----server.csprj
-Client(Dir)
----client.sln (bestaat uit client.csprj en sharedClasslib.csprj)
----client.csprj
-SharedClasslib(Dir)
----sharedClasslib.csprj

  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Ik denk niet dat je het erg vind als de client en de server exe elk een versie van de gedeelde code bevatten? (Indien ja, dan is een lib idd een goed idee).
Als je dit niet erg vind dan is het helemaal niet nodig om een lib te gebruiken hoor!
Gewoon de juiste header file(s) included van je gesharede code :) .

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Je hoeft de .lib niet zelf toe te voegen aan de lijst; Visual Studio kon al in VS6 zelf bedenken dat als project A dependent is op lib B, dat het dan wel handig is om B.lib mee te linken in A. Ik vermoed eerder dat er iets anders fout gaat. C en C++ geprobeerd te mengen? Mis je alle symbolen, of alleen een paar? Je hebt toch wel de CRT als DLL gelinkt?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

DieterVDW schreef op donderdag 27 januari 2005 @ 02:27:
Gewoon de juiste header file(s) included van je gesharede code :) .
Dat werkt dus niet, aangezien een header er nog niet voor zorgt dat de code ook meegecompileerd wordt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
@J27: Behalve dat jij 2 aparte solutions gebruikt, doe je precies wat ik wil. Ik had al een vermoeden dat ik het in deze hoek moest zoeken, alleen had ik het nog nooit eerder gedaan. En als er dan wat foutgaat, denk ik meteen dat ik wat over 't hoofd heb gezien.
(En de reden dat je mijn vraag niet denkt te begrijpen, is omdat mijn vraag
echt zo simpel is ;) )

@MSAlters: Je hebt gelijk, het was idd wat anders... een aantal symbolen konden niet gevonden worden omdat ze in de verkeerde namespace zaten. Omdat ik die wijziging gelijk met het splitsen van de solution over projects heb doorgevoerd, dacht ik dat het aan het laatste lag... :X
Nu werkt het idd zonder klagen: door de dependency wordt de Shared-lib vanzelf meegelinkt met de server, en alle symbolen worden gevonden.

Is het trouwens zo dat bij dependencies alleen tegen het resultaat van het dependant project kan worden gelinkt (in dit geval de shared-lib)? M.a.w. ben je verplicht om een library te maken als de code wil gebruiken in andere projecten, of kan je het Shared-project ook als executable maken, en vanuit de Client en Server direct tegen de object-files van het Shared-project linken?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, je kunt niet gelijktijdig een library en een executable maken. Dat wil je ook niet, aangezien je de functies die alleen belang zijn voor de executable (zoals de main of WinMain functies) helemaal niet in de library wilt hebben. Waarom maak je niet gewoon nog een project dat linkt met je library waar de relevante code voor de executable in zit? Dan ben je er ook :)

Er is overigens niets dat je verbiedt om source files in meerdere projecten toe te voegen. Ze worden dan alleen wel voor elk project afzonderlijk gecompileerd.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • bramseltje
  • Registratie: September 2001
  • Laatst online: 08-04 12:01
Je kunt die klasses/functies/etc. eventueel toch eenvoudig in een namespace klussen.

Deze namespace import je dan netjes bovenaan je clien/server source, zodat deze automatisch meegelinkt wordt.

Je hoeft maar in 1 van de projecten die code te openen en aan te passen, en de wijzigingen zijn in beide versies meegenomen...

Of is dit weer te simpel?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Of is dit weer te simpel?
Eerder onjuist, "namespaces importeren" klinkt namelijk niet als C++ maar eerder als managed C++ of C#

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Ik gebruik Visual Source Safe om bestanden over meerder projecten te delen. Je krijgt dan wel meerdere kopieen van het zelfde bestand, maar VSS zorgt voor de synchronisatie.
Pagina: 1