x86/x64 DLL nutzen
-
@Jochen
Wie kann ich VS2008 dazu bringen, dass aus meiner Datei library.cpp nun eine DLL erstellt wird, die den Namen libraryx64.dll trägt. Ich habe unter der x64 Konfiguration nur in den Eigenschaftsseiten unter KONFIGURATIONSEIGENSCHAFTEN-LINKER->AUSGABEDATEI folgendes stehen (OutDir)\\(ProjektName)x64.dll. Leider finde ich keine andere Eigenschaft, die Auswirkungen auf den Namen der Bibliothek hat.
-
Das ist doch OK. Diese Methode funktioniert aber nicht mehr unter VS-2010.
Warum nimmst Du nihct die Seite General -> Targetname.
Dann musst Du nirgends rumwühlen, da ändert man mit einem Schlag alles.
Bei mir steht bei der Linkerausgabe immer nur (TargetName)$(TargetExt)
-
Leider finde ich in meiner deutschen Version von VS-2008 unter allgemeine Eigenschaften keine Möglchkeit, den Zielnamen zu ändern.
-
Gleich der oberste Reiter/Eintrag in den Einstellungen/Baum.
Sowas wie Allgemein.Anmerkung:
Genau das ist der Punkt. Alle vernünftigen Anleitungen und Dokussind in Englisch, warum also mit der schlecht übersetzten deutschen Version arbeiten.
-
In den Eigenschaftsseiten ist der erste Eintrag "Allgemeine Eigenschaften".Dort sind nur Verweise eintragbar, aber es kann kein Name der DLL festgelegt werden. Mein Ziel ist es, dass ic über Menü ERSTELLEN/Funktion BATCH ERSTELLEN meine beiden Konfigurationen x86/x64 auf einmal übersetzen kann. Deshalb muss der Name der DLL konfigurationsabhängig geändert werden können. Wie schon eingangs erwähnt funktioniert alles, wenn ich beide DLL-Namen gleich halte. Aber dann weiss ich nicht, ob nun gerade die 32Bit oder die 64Bit DLL in einem Verzeichnis ist.
-
Wir benutzen meist auch die deutsche Version, haben dabei keine Probleme verschiedene DLL-Versionen mit verschiedenen Namen in unterschiedliche Verzeichnisse zu schreiben (Debug/Release, x86/x64). Das geht unter Eigenschaften -> Konfigurationseigenschaften -> Linker -> Ausgabedatei. Da tragen wir den relativen Pfad zur Projektwurzel ein. Für die lib Datei unter Linker -> Erweitert -> Importbibliothek.
-
nn schrieb:
Wir benutzen meist auch die deutsche Version, haben dabei keine Probleme verschiedene DLL-Versionen mit verschiedenen Namen in unterschiedliche Verzeichnisse zu schreiben (Debug/Release, x86/x64). Das geht unter Eigenschaften -> Konfigurationseigenschaften -> Linker -> Ausgabedatei. Da tragen wir den relativen Pfad zur Projektwurzel ein. Für die lib Datei unter Linker -> Erweitert -> Importbibliothek.
Das verändern der Linker Ausgabe Einstellungen führt in VS-2010 und später zu Problemen. Man sollte den Projketnamen auf der "General" Seite verändern!
-
Martin Richter schrieb:
Man sollte den Projketnamen auf der "General" Seite verändern!
Das ist in der Tat der einfachere Weg.
Martin Richter schrieb:
Das verändern der Linker Ausgabe Einstellungen führt in VS-2010 und später zu Problemen.
Kannst du das bitte mal genauer erklären, insbesondere den "und später" - Teil ? Das Projekt (30 DLLs) in dem ich diese Einstellungen gerade nachgeschaut habe wurde zwar ursprünglich mit 2003 erstellt, hat die Umstellungen nach 2005 und 2010 aber problemlos überstanden. Geht testweise mittlerweile auch in 2012. Insbesondere kann man die DLLs auch problemlos aus den aufrufenden Projekten debuggen. Welcher Art sind diese Probleme und wann treten sie auf ?
-
@nn
Ich habe auch keine Probleme, die DLL'S mit verschiedenen Namen in unterschiedliche Verzeichnisse (x86/x64) zu erstellen.Dazu nutze ich wie Sie den Parameter Ausgabedatei in den Projekteinstellungen.
Das aufrufende Programm sucht aber immer nach der Library nn.ddl und nicht nnx64.dll. Das ist mein Problem. Nach einem manuellen Umbenennen der nnx64.dll zurück in nn.dll hat mein aufrufendes Programm keine Probleme mehr.
Eine andere Sache. Sie ziehen die Lib über Importbibliothekl in Linker-erweitert ein (vollständiger Pfad, kein relativer). Das klappt bei mir nicht. Linker meldet immer "nicht aufgelöstes externes Symbol". Ich muss das Einbinden über #pragma comment machen (siehe einen meiner vorherigen Beiträge).
-
afk143 schrieb:
Leider finde ich in meiner deutschen Version von VS-2008 unter allgemeine Eigenschaften keine Möglchkeit, den Zielnamen zu ändern.
Da hast du recht, ich habe hier gerade 2008 und 2010 in deutsch offen:
In 2008 steht unter Allgemein:
Ausgabeverzeichnis
Zwischenverzeichnis
Beim Bereinigen zu löschende ...In 2010 steht:
Ausgabeverzeichnis
Zwischenverzeichnis
Zielname
Zielerweiterung
Bei der Bereinigung zu löschende ...Das erkärt auch, warum Zielname bei unseren von älteren Versionen übernommen Projekten nicht verwendet wurde ...
afk143 schrieb:
@nn
Das aufrufende Programm sucht aber immer nach der Library nn.ddl und nicht nnx64.dll.Das kann ich leider auch nicht reproduzieren. Bei mir haben die dll und lib Dateien je nach Konfiguration anderer Namen. Der Name der passenden Importlib ist, bei jeder Konfiguration passend, unter Linker -> Eingabe -> Zusätzliche Abhängigkeiten eingetragen. Das funktionier bei allen mir bekannten Visual Studio Versionen.
-
@nn
Einbinden der Lib geht über #pragma und auch über Eigneschaften/Linker/Eingabe/zusätzliche Anhängigkeiten. Der Fehler lag bei mir.ZUSAMMENFASSUNG:
Aus den letzen Diskussionsbeiträgen schließe ich, dass man mit VS2008 eine DLL (konfigurationsabhängig) nicht mit unterschiedlichen Namen generieren kann. Es kann nur der Name der Ausgabedatei geändert werden, was der aufrufenden Funktion nichts nützt. Falls nicht noch ein "MVP" eine andere Idee hat, werde ich wohl jetzt für x86/x64 den gleichen DLL- Namen nutzen und in naher Zukunft auf VS2012 umsteigen.
-
*snip*
-
Klar kann man unterschiedliche Dateinamen verwenden. Das würde ich sogar empfehlen... und ich würde es nur via #pragma comment einbinden...
-
@Jochen:
Wenn ich aber mit VS2008 keinen konfigurationsabhängigen DLL- Namen festlegen kann, dann sucht mein aufrufendes x64- Programm nach meiner <n>.dll und nicht nach meiner <n>x64.DLL. Damit sind wir wieder am Ausgangspunkt der Diskussion.
-
Das stimmt nicht. Irgendwo da liegt dein (Denk-) Fehler.
-
afk143 schrieb:
@Jochen:
Wenn ich aber mit VS2008 keinen konfigurationsabhängigen DLL- Namen festlegen kannKannst du doch.
Ich verstehe nicht wie man da so lange rumprobieren kann, und es immer noch nicht hinbekommen.Bei VS 2008 musst du lediglich den Namen unter "Linker/General/Output File" eintragen.
Dadurch ändert sich der "TargetName", und damit auch alle Einstellungen die $(TargetName) verwenden.
Wie z.B. der Name der generierten LIB.Mach am besten ein neues Projekt, oder geh alle Einstellungen an denen du rumprobiert hast durch und setze sie auf "<inherit from parent project or defaults>".
-
@hustbaer
Ich gebe Dir völlig recht, dass das lange Rumprobieren völlig unverständlich ist.
Deshalb habe ich ein neues Projekt für eine DLL aufgemacht: "UlkLibrary". Dort eine Funktion definiert.- Neue Konfiguration für x64 angelegt.
- In Eigenschaften/Linker/Allgemein die Ausgabedatei mit Postfix x64 versehen.
- Es enstehen ulklibraryx64.dll, ulklibraryx64.lib,...
- Danach ulklibraryx64.dll in das Verzeichnis des aufrufenden Programmes kopiert.
- Nun in mein x64- aufrufendes Programm diese Funktion aufgerufen. Vorher über #pragma die ulklibraryx64.lib eingebunden.
- Compiler + Linker OK.
- Programm gestartet. Fehler: Kann Ulklibrary.dll" nicht finden.
-
Was soll den der Quatsch mit den Linkeroptionen. In den allgemeinen Projekteinstellungen legt man den Namen fest!
-
Martin Richter schrieb:
Was soll den der Quatsch
Das frage ich mich bei dieser Antwort allerdings auch.
nn schrieb:
afk143 schrieb:
Leider finde ich in meiner deutschen Version von VS-2008 unter allgemeine Eigenschaften keine Möglchkeit, den Zielnamen zu ändern.
Da hast du recht, ich habe hier gerade 2008 und 2010 in deutsch offen:
In 2008 steht unter Allgemein:
Ausgabeverzeichnis
Zwischenverzeichnis
Beim Bereinigen zu löschende ...In 2010 steht:
Ausgabeverzeichnis
Zwischenverzeichnis
Zielname
Zielerweiterung
Bei der Bereinigung zu löschende ...Ja, wo ist die denn, in einem deutschen VS2008, gibt es die etwa im Englischen ?
hustbaer schrieb:
Bei VS 2008 musst du lediglich den Namen unter "Linker/General/Output File" eintragen.
Dadurch ändert sich der "TargetName", und damit auch alle Einstellungen die $(TargetName) verwenden.
Wie z.B. der Name der generierten LIB.So habe ich das seit VS 2002 auch verstanden und teilweise auch mit VS 2010 gemacht.
nn schrieb:
Martin Richter schrieb:
Das verändern der Linker Ausgabe Einstellungen führt in VS-2010 und später zu Problemen.
Kannst du das bitte mal genauer erklären, insbesondere den "und später" - Teil ? ... Welcher Art sind diese Probleme und wann treten sie auf ?
Natürlich keine Antwort.
-
Martin Richter schrieb:
Was soll den der Quatsch mit den Linkeroptionen. In den allgemeinen Projekteinstellungen legt man den Namen fest!
Den Quatsch kann ich dir zurückgeben
Wieso redest du dauernt von einer Einstellung die es bei VS 2008 noch nicht gibt?Ja, die Variable $(TargetName) gibt es. Die wird aber nirgends eingegeben, sondern vom Linker Output-Pfad hergeleitet.
Falls man das sonst noch wo einstellen kann lass es mich wissen. Dort wo es bei VS 2010 einzustellen geht ("Configuration Properties/General") gibt es die Einstellung bei VS 2008 definitiv nicht - hab ich grad extra nachgesehen, da is nix.
@nn
Ne, gibt's im Englichen Studio auch nicht, die Einstellung ist bei 2010 neu.