防止CMake找到已安装的库而不是"本地"库

Vit*_*meo 5 c++ linux build cmake shared-libraries

我正在同时处理多个项目(一些库,以及一些依赖它们的游戏).他们全都在GitHub上,在单独的回购中.

为方便起见,我将每个仓库拉到"工作区文件夹"中,如下所示:

/home/myWorkspace/Library1/
/home/myWorkspace/Library2/
/home/myWorkspace/Library3/
/home/myWorkspace/App1/
/home/myWorkspace/App2/
Run Code Online (Sandbox Code Playgroud)

我有FindLibrary1,FindLibrary2FindLibrary3.cmake文件,这些文件按顺序查找库../(对应于"myWorkspace"文件夹),然后/usr/lib/.

在Windows上,CMake myWorkspace/在Linux上找到了库,无论如何,总是首先找到已安装的库.

由于我想在myWorkspace/文件夹中工作,然后在完成后安装库,我更喜欢CMake查找并链接myWorkspace/文件夹中的所有内容.

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

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


SSVUtils:没有依赖性的库

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

FindSSVUtils.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/文件夹,同时仍然有可能在文件系统路径中找到libs?

Gui*_*ume 5

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

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

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

find_path(... NO_CMAKE_SYSTEM_PATH)

if (nothing_found)
    find_path(...)
endif()
Run Code Online (Sandbox Code Playgroud)