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

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

我使用了源代码构build和在Linux上的二进制文件被放到自己的目录。 当我在linux上执行这个操作时,eclipse以某种方式能够find共享对象,并且很好地运行可执行文件,但是在Windows上这种情况不会发生。

在Windows上,我不得不添加一个指向dll的PATH环境variables,或者我可以将其构build到一个bin和lib目录中(尽pipe我过去曾经用过一个我忘记的问题,使我想避免这个问题) 。

为什么这在Windows上运行不同于linux? 这是我失踪的设置还是这只是不工作?

构build本身正在完美工作。 我正在使用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运行(不知道这是否可能)运行时,可能注入额外的目录到您的路径。

如果你关心的是构建树,那么下面的代码就可以很好地工作(如下面的注释所示):

 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)块来保护。

只是对我自己的问题的一个可能的答案。 我认为,在Linux上,rpath被用来标识依赖库的位置,但是在mingw的窗口中,我不能使用elf解析器,所以不能使用rpath。