Windows verfügt einfach nicht über einige der erforderlichen Konzepte, damit CMake Ihre Build-Umgebung einrichten kann. Beim Verknüpfen sucht Windows im selben Verzeichnis wie die Binärdatei und durchsucht dann die Verzeichnisse in Ihrem PATH. Es gibt nichts wie RPATH, das auf den meisten Unix-Plattformen verwendet wird, um andere geeignetere Pfade einzufügen. Die DLLs sollten im Allgemeinen zusammen mit Ihren Binärdateien im selben Verzeichnis installiert werden.
Meiner Meinung nach besteht die beste Vorgehensweise unter Windows darin, die DLLs neben Ihren Binärdateien zu platzieren. CMake versucht, dies zu vereinfachen,
install(TARGETS MyTarget
EXPORT "MyProjectTargets"
RUNTIME DESTINATION "${INSTALL_RUNTIME_DIR}"
LIBRARY DESTINATION "${INSTALL_LIBRARY_DIR}"
ARCHIVE DESTINATION "${INSTALL_ARCHIVE_DIR}")
würde DLLs im RUNTIME-Ziel installieren, aber die Bibliotheken im LIBRARY-Ziel ablegen. Dies bedeutet, dass lib normalerweise auf Unix-ähnlichen Betriebssystemen die gemeinsam genutzten Objekte enthält, aber CMake weiß, dass DLLs effektiv Laufzeit sind und in den Papierkorb gehen würden. Das macht die Sache hoffentlich klarer. Es ist für CMake/Eclipse unmöglich, wirklich so viel zu verbessern, abgesehen davon, dass vielleicht zusätzliche Verzeichnisse in Ihren PATH eingefügt werden, wenn Sie von Eclipse aus auf Ausführen klicken (nicht sicher, ob das möglich ist).
Wenn Sie sich mit dem Build-Baum befassen, dann würde das Folgende dort gut funktionieren (wie in den Kommentaren unten vorgeschlagen):
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
Wenn Sie zulassen möchten, dass diese überschrieben werden (kann nützlich sein), sollten sie auch mit if(NOT var_name)-Blöcken geschützt werden.
Nur eine mögliche Antwort auf meine eigene Frage. Ich denke, dass unter Linux der rpath verwendet wird, um die Speicherorte der abhängigen Bibliotheken zu identifizieren, aber unter Windows mit mingw kann ich den Elf-Parser nicht verwenden und kann daher rpath nicht verwenden.