5

ここで非常に明白な何かが欠けていると思いますCMAKE_FIND_LIBRARY_PREFIXES/CMAKE_FIND_LIBRARY_SUFFIXESが、現在のシステム/設定によっては、cmake変数が「まともな」デフォルト値に設定されていないようです! 私はcmakeのドキュメントとグーグルをチェックしましたが、実際には何もないようです。

たとえば、find_package(OpenSSL REQUIRED)メインファイルに変数を設定するか、cmake -DCMAKE_FIND_LIBRARY_PREFIXES=lib -DCMAKE_FIND_LIBRARY_SUFFIXES=.so ..(openssl/libssl-devがインストールされたubuntuで)直接呼び出す場合を除き、単純なCMakeLists.txtの呼び出しは本質的に壊れますが、ターゲットのデフォルト値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

Windows (ビジュアルスタジオ):

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 に答える