4

Intel TBB (共有ライブラリの使用が必要) に依存する単純な C++ プロジェクトがあります。Conan パッケージ マネージャーを CMake と組み合わせて使用​​してこれをビルドしようとしていますが、このセットアップを使用して、共有されていない依存関係を問題なく追加することができました。


私の最初の試み (パッケージを使用するための conan の conanfile.txt ドキュメントの情報とconan の conanfile.py リファレンス ガイドconanfile.pyを組み合わせたもの) では、次のようなものを使用しました。

import os
from conans import ConanFile, CMake

class MyProjectConan(ConanFile):
    settings = 'os', 'compiler', 'build_type', 'arch'
    requires = 'TBB/2018_U6@conan/stable'
    generators = 'cmake'

    def build(self):
        cmake = CMake(self)
        cmake.configure()
        cmake.build()

    def imports(self):
        self.copy('*.dll', src='bin', dst='bin')
        self.copy('*.dylib*', src='lib', dst='bin')
        self.copy('*.so', src='lib', dst='bin')

そしてCMakeLists.txtこのような:

cmake_minimum_required(VERSION 2.8.12)
project(MyProject)

add_definitions("-std=c++17")

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()

add_executable(main src/main.cpp)
target_link_libraries(main ${CONAN_LIBS})

(myは、TBB パッケージのテスト ファイルのsrc/main.cpp直接のコピーです)

これはうまく構築されました。

conan install -if build .
conan build -bf build .

しかし、実行./build/bin/mainは次のエラーで失敗しました:

dyld: Library not loaded: @rpath/libtbb.dylib
  Referenced from: <project-dir>/./build/bin/main
  Reason: image not found
Abort trap: 6

私は MacOS を使用していますが、このエラーは既知の (ただし明らかに修正された) 問題に似ているため、独自のディレクトリからバイナリを実行してみました。cd build/bin; ./main、しかし同じエラーを見ました。これがうまくいかなかった理由はわかりませんが、デバッグに多くの時間を費やすことなく、別のアプローチに移りました。


次に、conan のドキュメントの RPATHs ガイドの「さまざまなアプローチ」に従って、最終的に次のようになりました。

class MyProjectConan(ConanFile):
    # (rest of class is same as before)

    def imports(self):
        self.copy('*.dll', src='bin', dst='bin')
        self.copy('*.dylib*', src='lib', dst='lib') # changed bin to lib
        self.copy('*.so', src='lib', dst='lib') # changed bin to lib

この:

cmake_minimum_required(VERSION 2.8.12)
project(MyProject)

add_definitions("-std=c++17")

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(KEEP_RPATHS)

if(APPLE)
    set(CMAKE_INSTALL_RPATH "@executable_path/../lib")
else()
    set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib")
endif()

add_executable(main src/main.cpp)
target_link_libraries(main ${CONAN_LIBS})

ビルドも実行もできます。しかし、実行可能ファイルを調べると、それが を参照していることがわかります/Users/me/.conan/data/TBB/2018_U6/conan/stable/package/03db91a62823ebc2b1df6e5cf549c2f674116656/lib。これは明らかに、そのコードが行うべきことではありません (私が期待していた、@rpath/../libまたは同様のものでした)。libまた、兄弟フォルダーに配置されたファイルではなく、バイナリが実際にこのパスを使用していることも確認しました。


この時点で私は立ち往生しています。CMake にはRPATH 処理用のオプションがいくつかあることがわかりますが、特に関連性があると思われるものは何もなく、2 回目の試行 (conan のドキュメントから直接取得) のコードが機能しない理由がわかりません。

共有ライブラリを conan で動作させるにはどうすればよいですか? (理想的にはクロスプラットフォームですが、少なくとも MacOS では)

4

1 に答える 1