CMake 为 OpenSSL 返回不匹配的包含和库

CMake returning mismatched includes and libraries for OpenSSL

我通过 macports 安装了最新版本的 OpenSSL (1.0.2q),我正在尝试在我的 mac 上构建一个依赖 OpenSSL 的项目,发现 CMake 似乎返回错误的库路径或错误的包含路径:

message("@@@")
message(${OPENSSL_INCLUDE_DIR})
message(${OPENSSL_SSL_LIBRARY})
message("/@@@")

打印:

@@@
/opt/local/include
/usr/lib/libssl.dylib
/@@@

所以它给了我 headers 来自 mac 端口的 OpenSSL 和来自系统的库。

我发现这是因为构建外部库失败并出现链接错误:

Undefined symbols for architecture x86_64:
  "_X509_check_host", referenced from:
      _ma_tls_verify_server_cert in libmariadbclient.a(openssl.c.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如何让 CMake 仅查找和使用 macports 库?

您可以使用 OPENSSL_ROOT_DIR environment 变量(不是 CMake 变量!)提示 CMake 关于 OpenSSL 的位置,方法是将其设置为/opt/localCMake not able to find OpenSSL library 中描述的其他提示方式也可以使用。


请注意,从链接器和运行时加载程序 "hide" 系统目录 /usr/lib 下的库可能非常棘手。这是因为项目使用的其他库可能位于该目录中,这可能会阻止 CMake 构建正确的目录列表以传递给链接器或分配给 RPATH。通常,CMake 会对这种情况发出警告。