2016-01-03 12 views
9

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

+0

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

+0

@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. –

+1

@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. –

Antwort

1

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") 
3

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") 
Verwandte Themen