Windows上的Cmake不添加共享库路径(适用于Linux)

Mat*_*_JD 5 c++ eclipse linux windows cmake

我一直在Linux上使用CMake和Eclipse一段时间,并且一直在处理包含大量可执行文件和共享对象的多个目标项目.

我使用源代码构建,在Linux上,二进制文件被放入他们自己的目录中.当我在linux上执行此操作时,eclipse在某种程度上能够找到共享对象并运行可执行文件,但在Windows上这不会发生.

在Windows上我必须添加一个指向dll的PATH环境变量,或者我可以构建到一个bin和lib目录中(虽然我有一个问题,我过去忘记了CMake让我想避免这个) .

为什么Windows在Linux上的工作方式不同?这是我缺少的设置还是这不起作用?

构建本身工作得很好.我正在使用MinGW,Eclipse Kepler和Windows 7 64位.

提前致谢.

Mar*_*ell 7

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}")
Run Code Online (Sandbox Code Playgroud)

将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")
Run Code Online (Sandbox Code Playgroud)

如果要允许覆盖这些(可能有用),则应使用if(NOT var_name)块来保护它们.