Windows根本没有一些必要的概念来允许CMake设置您的构建环境.链接时,Windows将查找与二进制文件相同的目录,然后搜索PATH中的目录.在大多数Unix平台上都没有像RPATH那样注入其他更合适的路径. DLL通常应与二进制文件一起安装在同一目录中.
在我看来,Windows上的最佳实践是将DLL放在二进制文件旁边. CMake试图让这更容易,
install(TARGETS MyTarget
EXPORT "MyProjectTargets"
RUNTIME DESTINATION "${INSTALL_RUNTIME_DIR}"
LIBRARY DESTINATION "${INSTALL_LIBRARY_DIR}"
ARCHIVE DESTINATION "${INSTALL_ARCHIVE_DIR}")
将DLL安装到RUNTIME目标,但将libs放在LIBRARY目标中.这意味着通常在类Unix操作系统上,lib具有共享对象,但CMake知道DLL是有效的运行时并且会进入bin.希望这会使事情更加清晰. CMake / Eclipse不可能真正改善这一点,除了在点击从Eclipse运行时将额外的目录注入到PATH中(不确定是否可行).
如果您关注构建树,那么以下内容可以很好地工作(如下面的注释中所示):
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")
如果要允许覆盖这些(可能有用),则应使用if(NOT var_name)块来保护它们.