Windows semplicemente non ha alcuni dei concetti necessari per consentire a CMake di configurare il tuo ambiente di compilazione. Quando si collega Windows cercherà nella stessa directory del file binario, quindi cercherà le directory nel PERCORSO. Non esiste nulla come RPATH, utilizzato sulla maggior parte delle piattaforme Unix, da inserire in altri percorsi più appropriati. Le DLL dovrebbero generalmente essere installate insieme ai tuoi file binari, nella stessa directory.
Secondo me, la migliore pratica su Windows è mettere le DLL accanto ai tuoi binari. CMake tenta di rendere tutto più semplice,
install(TARGETS MyTarget
EXPORT "MyProjectTargets"
RUNTIME DESTINATION "${INSTALL_RUNTIME_DIR}"
LIBRARY DESTINATION "${INSTALL_LIBRARY_DIR}"
ARCHIVE DESTINATION "${INSTALL_ARCHIVE_DIR}")
installerebbe le DLL nella destinazione RUNTIME, ma inserirà le librerie nella destinazione LIBRARY. Ciò significa che in genere su sistemi operativi simili a Unix lib ha gli oggetti condivisi, ma CMake sa che le DLL sono effettivamente runtime e andrebbero in bin. Speriamo che questo renda le cose più chiare. È impossibile per CMake/Eclipse migliorare davvero così tanto, oltre forse all'inserimento di directory aggiuntive nel tuo PERCORSO quando fai clic su Esegui da Eclipse (non sono sicuro che sia possibile).
Se sei interessato all'albero di compilazione, allora il seguente funzionerebbe bene lì (come suggerito nei commenti qui sotto):
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")
Se vuoi permettere che questi vengano sovrascritti (può essere utile) dovrebbero essere protetti anche con i blocchi if(NOT var_name).
Solo una possibile risposta alla mia stessa domanda. Penso che su Linux venga utilizzato rpath per identificare le posizioni delle librerie dipendenti, ma su Windows con mingw non posso utilizzare l'elf parser e quindi non posso utilizzare rpath.