【问题标题】:Preventing CMake from finding installed libraries instead of "local" libraries防止 CMake 查找已安装的库而不是“本地”库
【发布时间】:2013-05-28 08:38:14
【问题描述】:

我同时处理多个项目(一些库和一些依赖它们的游戏)。它们都在 GitHub 上,位于单独的存储库中。

为方便起见,我将每个 repo 都拉到一个“工作区文件夹”中,如下所示:

/home/myWorkspace/Library1/
/home/myWorkspace/Library2/
/home/myWorkspace/Library3/
/home/myWorkspace/App1/
/home/myWorkspace/App2/

我有FindLibrary1FindLibrary2FindLibrary3 .cmake 文件,它们依次在../(对应于“myWorkspace”文件夹)中查找库,然后是/usr/lib/

虽然在 Windows 上 CMake 会在 myWorkspace/ 中找到库,但在 Linux 上,无论如何,总是首先找到已安装的库。

由于我想在 myWorkspace/ 文件夹中工作,然后在我完成后安装库,我希望 CMake 找到并链接 myWorkspace/ 文件夹中的所有内容。

如果没有myWorkspace/文件夹,我也希望CMake搜索/usr/lib//usr/local/lib/中的库,但如果myWorkspace/存在,它应该具有优先级。

我正在使用的 CMake 文件示例:


SSVUtils:没有依赖的库

SSVUtils CMakeLists:https://github.com/SuperV1234/SSVUtils/blob/master/CMakeLists.txt

查找SSVUtils.cmake:https://github.com/SuperV1234/SSVUtils/blob/master/cmake/modules/FindSSVUtils.cmake


SSVUtilsJson:依赖于 SSVUtils 和 SSVJsonCpp 的库

SSVUtilsJson CMakeLists:https://github.com/SuperV1234/SSVUtilsJson/blob/master/CMakeLists.txt

FindSSVUtilsJson.cmake:https://github.com/SuperV1234/SSVUtilsJson/blob/master/cmake/modules/FindSSVUtilsJson.cmake


有什么想法可以优先考虑myWorkspace/ 文件夹,同时仍然可以在文件系统路径中找到库?

【问题讨论】:

    标签: c++ linux build cmake shared-libraries


    【解决方案1】:

    默认情况下,find_path(或 find_library 等)首先检查系统标准位置中的文件,然后再搜索 PATH 中提供的值。这就是为什么总是首先在 Linux 上找到“已安装”的库(但在 Windows 上却没有,因为它没有安装库的标准位置)。

    您可以使用 NO_CMAKE_SYSTEM_PATH 选项禁用该行为:它将跳过对标准位置中文件的检测。

    现在...如果您仍然想在找不到本地版本时使用已安装的库作为后备,您可以分两步完成:

    find_path(... NO_CMAKE_SYSTEM_PATH)
    
    if (nothing_found)
        find_path(...)
    endif()
    

    【讨论】:

      最近更新 更多