Ich habe eine CMake erstellen, die/IMPLIB an den Linker unter Windows sendet. Dies ist in meinem Fall ein Problem, da das Argument implib der gleiche Pfad wie eine der Eingabedateien ist. Es sieht aus, dass CMake wird immer Problem/IMPLIB beim Erstellen mit Visual Studio, und das übergebene Argument kann nicht geändert werden. Gibt es eine Möglichkeit, dieses Verhalten zu steuern?Wie verhindert werden, dass CMake ausgibt/IMPLIB
Antwort
Ich glaube nicht, dass es möglich ist zu verhindern, dass CMake eine /IMPLIB
Option an den Linker ausgibt. Sie können jedoch steuern, um die Namen der generierten Importbibliothek durch die folgenden Eigenschaften einer gemeinsamen Bibliothek Zieleinstellschaltung:
add_library(foo SHARED foo.cpp)
# set base name of generated DLL import library
set_target_properties(foo PROPERTIES ARCHIVE_OUTPUT_NAME "bar")
# set prefix of generated DLL import library
set_target_properties(foo PROPERTIES IMPORT_PREFIX "")
# set suffix of generated DLL import library
set_target_properties(foo PROPERTIES IMPORT_SUFFIX ".lib")
Der Name der generierten Shared Library kann, indem die folgenden Zieleigenschaften eingestellt werden:
# set base name of generated DLL shared library
set_target_properties(foo PROPERTIES RUNTIME_OUTPUT_NAME "bar")
# set prefix of generated DLL shared library
set_target_properties(foo PROPERTIES PREFIX "")
# set suffix of generated DLL shared library
set_target_properties(foo PROPERTIES SUFFIX ".dll")
bei CMake der Quelle der Suche cmComputeLinkInformation.cxx
es wird nur eine gültige /implib:...
Option hinzufügen, wenn CMAKE_IMPORT_LIBRARY_SUFFIX
gesetzt:
// Check whether we should use an import library for linking a target. this->UseImportLibrary = this->Makefile->IsDefinitionSet("CMAKE_IMPORT_LIBRARY_SUFFIX");
So im folgenden Test wurde die Import-Bibliothek von meinem ausführbaren Projekt Optionen entfernt:
cmake_minimum_required(VERSION 3.0)
project(NoImpLib CXX)
unset(CMAKE_IMPORT_LIBRARY_SUFFIX)
file(WRITE main.cpp "int main() { return 0; }")
add_executable(${PROJECT_NAME} main.cpp)
Einer VS spezifische Alternative - da diese Option nicht gesetzt ist anders/je nach Konfiguration - würde sein, um die globale Eigenschaft hinzuzufügen IgnoreImportLibrary
mit:
set_target_properties(${PROJECT_NAME} PROPERTIES VS_GLOBAL_IgnoreImportLibrary "true")
- 1. Wie kann verhindert werden, dass Flexboxen schrumpfen?
- 2. Wie kann verhindert werden, dass CMake beim Installieren einen Symlink für gemeinsam genutzte Bibliotheken erstellt?
- 3. Wie kann verhindert werden, dass Bilder/Blöcke umgebrochen werden?
- 4. Wie kann verhindert werden, dass Eigenschaften zwischen Widgets freigegeben werden?
- 5. Transaktionsannotation verhindert, dass Dienste verspottet werden
- 6. Wie verhindert man, dass automatisch implementierte Eigenschaften serialisiert werden?
- 7. Wie verhindert man, dass floatende Zahlen in Perl abgerundet werden?
- 8. Wie kann verhindert werden, dass eine WPF-App geladen wird?
- 9. Wie verhindert man, dass URLs in TextView eingebunden werden?
- 10. Wie kann verhindert werden, dass d3 den Rechtsklick auslöst?
- 11. Wie verhindert man, dass String-Literale gebrochen werden?
- 12. Wie verhindert man, dass Model Events mit phpunit ausgelöst werden?
- 13. Wie kann verhindert werden, dass div umgebrochen wird?
- 14. Wie kann verhindert werden, dass Flex-Artikel überlaufen?
- 15. Wie verhindert werden, dass Eclipse Dateien als fehlerhaft markiert
- 16. Wie kann verhindert werden, dass Windows Com-Klasseninformationen zwischenspeichert?
- 17. Wie kann verhindert werden, dass die Verbindung zurückgesetzt wurde?
- 18. Wie kann verhindert werden, dass Ember.js 1.0.0 URL-Parameter entfernt?
- 19. Wie kann verhindert werden, dass JPA Transaktionen rückgängig macht?
- 20. Wie kann verhindert werden, dass gespeicherte Prozeduren Zwischen-Recordsets zurückgeben?
- 21. Wie kann verhindert werden, dass ein Modul zweimal importiert wird?
- 22. Wie kann verhindert werden, dass PyCharm geöffnete Dateien automatisch schließt?
- 23. Wie kann verhindert werden, dass Nohup die Befehlszeile "verstopft"?
- 24. Wie verhindert man, dass Formulareingaben in Servlets gelöscht werden?
- 25. DBGrid: Wie kann verhindert werden, dass eine Zeile ausgewählt wird?
- 26. Wie kann verhindert werden, dass Tasten nach unten überlaufen?
- 27. Wie kann verhindert werden, dass UITableView nach unten scrollt?
- 28. Wie kann verhindert werden, dass Intelli Scala als Warnung behandelt?
- 29. Wie kann verhindert werden, dass Bundler Binstubs generiert?
- 30. Wie verhindert man, dass Waf Objektdateien umbenennt?
Was für Namen geben Sie Eingabedateien die gleichen wie ein Import li ironisch? Und was meinst du mit "das übergebene Argument kann nicht geändert werden"? Kann nicht oder Sie wissen einfach nicht wie? – Youka
@Youka Wenn ich verstehe, fragen Sie, warum die Eingabedatei und die Importbibliothek den gleichen Namen haben. Dies ist zufällig, dass das Produkt entweder als eine Bibliothek oder als eine ausführbare Datei aus derselben Bibliothek bereitgestellt werden kann, also ist die Lib foo.lib, die exe ist foo.exe. CMake versucht anscheinend, eine Import-Bibliothek zu erstellen, die es nennt ... foo.lib. In der Praxis wird diese Bibliothek nicht erstellt (es gibt keine zu exportierenden Symbole!), Aber MSBuild erkennt den Namenskonflikt und beendet die Erstellung. –
@Yuka Ich glaube, dass das übergebene Argument nur durch Ändern des Produktnamens geändert werden kann, was mich ein wenig überrascht. Mit anderen Worten erwarte ich, dass, wenn ich eine Bibliothek namens foo.dll erstellen würde, es möglich sein sollte (obwohl schlecht beraten!), Die Importbibliothek bar.dll zu nennen. Aber ich habe keinen Weg gefunden, dies zu tun. CMake von der Ausgabe/IMPLIB zu stoppen wäre ideal; Schließlich sehe ich die Verwendung von/IMPLIB in Verbindung mit dem Erstellen einer ausführbaren Datei nicht. –