4

私のC++プロジェクトを構築するためにCMakeLists.txtファイルを書いています。

  1. libhybris.so: いくつかのエクスポートされた関数を含む共有ライブラリ。
  2. hybris: libhybris.so にリンクする実行可能ファイル
  3. libhybris.so にリンクするさまざまな共有ライブラリのセット

問題は、libhybris.so が (正規表現機能のために) libpcre に依存しているため、次のステートメントがあることです。

# libhybris.so generation
add_library( libhybris 
             SHARED 
             ${LIB_SOURCES} )

...

# Needed libraries
target_link_libraries( libhybris 
                       dl 
                       pcre 
                       pthread
                       readline )

そして、ポイント 3 の共有ライブラリの 1 つは pcre.so と呼ばれているため、次のものもあります。

add_library( pcre SHARED ${PCRE_SOURCES} )

...

target_link_libraries( pcre
                       dl 
                       pcre 
                       curl
                       pthread
                       readline
                       ffi 
                       libhybris )

したがって、「cmake .」を実行すると、次のエラーが発生します。

-- Configuring done
CMake Error: The inter-target dependency graph contains the following strongly connected component (cycle):
  "libhybris" of type SHARED_LIBRARY
    depends on "pcre"
  "pcre" of type SHARED_LIBRARY
    depends on "libhybris"
At least one of these targets is not a STATIC_LIBRARY.  Cyclic dependencies are allowed only among static libraries.

CMake は libhybris.so pcre 依存関係 (システム libpcre.so) が私の pcre.so と同じであると考えているため、明らかにそうではありません。

pcre.so 名を変更せずにこの問題を解決するにはどうすればよいですか?

4

2 に答える 2

1

CMake では、リンク ライブラリをフル パスで指定することをお勧めします。システム ライブラリのフル パスを取得するには、FIND_PACKAGE(...)サポートされている場合は使用するか、単に使用できます。FIND_LIBRARY(...)

例えば、

FIND_LIBRARY( PCRE_SYSTEM_LIB pcre )

ADD_LIBRARY( libhybris SHARED ${LIB_SOURCES} )
TARGET_LINK_LIBRARIES( libhybris
                       ${PCRE_SYSTEM_LIB}
                       ......
                      )

これにより、CMake がターゲットとして認識するもの ( nameley pcre) をそのターゲットのフル パスに展開できなくなります。

于 2013-01-22T16:04:42.700 に答える
0

開発環境によって異なります。これらの問題を克服するビルド パスを設定できます。

于 2010-06-04T22:27:37.697 に答える