我在 Linux 上使用 CMake 和 Eclipse 一段时间了,并且一直在处理包含大量可执行文件和共享对象的多个目标项目。
我使用源代码构建,在 Linux 上,二进制文件被放入它们自己的目录中。当我在 Linux 上执行此操作时,Eclipse 能够以某种方式找到共享对象并正常运行可执行文件,但在 Windows 上这不会发生。
在 Windows 上,我必须添加一个指向 dll 的 PATH 环境变量,或者我可以构建到单个 bin 和 lib 目录中(尽管我过去忘记了 CMake 的一个问题,这让我想避免这种情况) 。
为什么 Windows 和 Linux 上的工作方式不同?这是我缺少的设置还是这不起作用?
构建本身运行完美。我正在使用 MinGW、Eclipse Kepler 和 Windows 7 64 位。
提前致谢。
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 目标,但将库放在 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) 块进行保护。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)