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位.
提前致谢.
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)块来保护它们.
| 归档时间: |
|
| 查看次数: |
2397 次 |
| 最近记录: |