5

我想我在这里遗漏了一些非常明显的东西,但在我看来,cmake 变量CMAKE_FIND_LIBRARY_PREFIXES/CMAKE_FIND_LIBRARY_SUFFIXES没有设置为任何“体面”的默认值,具体取决于当前的系统/设置!我已经检查了 cmake 文档和谷歌,但似乎真的没有。

例如,一个简单的 CMakeLists.txt 基本上调用find_package(OpenSSL REQUIRED)将中断,除非您在主文件中设置变量或直接调用cmake -DCMAKE_FIND_LIBRARY_PREFIXES=lib -DCMAKE_FIND_LIBRARY_SUFFIXES=.so ..(在安装了 ubuntu w openssl/libssl-dev 的 ubuntu 上)另一方面,初始化目标的默认值 PREFIX/SUFFIX每个平台都“正确”,即使考虑 BUILD_SHARED_LIBS 等,为什么不用于 find_library?

有谁知道为什么/建议的(用户)行为应该是什么?

4

2 回答 2

8

cmake 变量 CMAKE_FIND_LIBRARY_PREFIXES/CMAKE_FIND_LIBRARY_SUFFIXES 未设置为任何“体面”的默认值

你为什么这么认为?例如:

cmake_minimum_required(VERSION 3.1)
project(Foo)

message("prefix: ${CMAKE_FIND_LIBRARY_PREFIXES}")
message("suffix: ${CMAKE_FIND_LIBRARY_SUFFIXES}")

Linux(Ubuntu):

prefix: lib
suffix: .so;.a

苹果电脑:

prefix: lib
suffix: .dylib;.so;.a

视窗(视觉工作室):

prefix:
suffix: .lib

除非您在主文件中设置变量,否则调用 find_package(OpenSSL REQUIRED) 将中断

刚刚测试,对我来说很好用。Ubuntu 14.04。CMake 2.8.12.2 和 CMake 3.1.0-rc2。

于 2015-01-31T15:24:21.750 回答
4

所以我会再次自己回答这个问题,因为我需要比评论允许的更多空间。

我错过的“显而易见的事情”是我在调用“project(Foo)”之前访问了这些值,并且在那个阶段CMAKE_FIND_LIBRARY_PREFIXESCMAKE_FIND_LIBRARY_SUFFIXES没有初始化。无论如何都很高兴知道!

我正在检查是否可以构建主项目的条件,这涉及检查 cmake 版本是否足够新,是否应该在进一步下载和构建之前。另一方面,根据 cmake 约定,您需要在发出任何项目命令之前指定所需的最低版本。你看到那里的僵局了吗?因此,如果我需要即时构建更新的 cmake 版本,则应尽可能包含 OpenSSL。这是使用 检测到的find_package(OpenSSL),但反过来又访问了未初始化的CMAKE_FIND_LIBRARY_PREFIXES,一切都坏了。

于 2015-02-01T10:52:47.640 回答