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 では)