gpt4 book ai didi

c++ - Windows 上的 Cmake 不添加共享库路径(适用于 linux)

转载 作者:IT王子 更新时间:2023-10-29 01:13:36 26 4
gpt4 key购买 nike

我在 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 这样的东西来注入(inject)其他更合适的路径。 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 单击运行时可能将其他目录注入(inject)到您的 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) block 来保护。

关于c++ - Windows 上的 Cmake 不添加共享库路径(适用于 linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20433308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com