CMakeの:CMakeでライブラリの依存関係のPIC版とリンクするには?
我々はcpp-netlibへの依存性を持っています。
ビルドシステムの一部としてソースからビルドします。
cpp-netlib/CMakeLists.txt
:
add_library(cpp-netlib
STATIC
${SRCS})
は、ある特定のユースケースのために、我々は共有ライブラリでそれを使用する必要がありますので、私は有効-fPIC
を有する第二のライブラリ作成しました:
add_library(cpp-netlib_pic
STATIC
${SRCS})
set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE)
を共有ライブラリのターゲットでは、libcpp-netlib_pic.a
foo/CMakeLists.txt
:
add_library(foo
SHARED
${SRCS})
target_link_libraries(foo cpp-netlib_pic)
cpp-netlib
がboost_network
/usr/bin/ld: ../third_party/cpp-netlib/libcpp-netlib_pic.a(client.cpp.o): \
relocation R_X86_64_32 against `_ZTVN5boost7network4http4impl15normal_delegateE' \
can not be used when making a shared object; recompile with -fPIC
デマングル名の非PICバージョンにリンクしようとしているので、私は戻ってリンカエラーを取得しています:
$ c++filt _ZTVN5boost7network4http4impl15normal_delegateE
vtable for boost::network::http::impl::normal_delegate
ブーストビルド:
これはすべて、既存のビルドシステムをブーストビルドからCMakeに移行する作業の一部です。
ブーストビルドのJamファイルは正常に動作します。
Jamroot
:
variant pic : release : <cxxflags>-fPIC ;
cpp-netlib/Jamfile
:
lib cpp-netlib
: [ glob src/*.cpp ]
;
foo/Jamfile
:
shared-lib foo
: [ glob *.cpp ]
/ext/cpp-netlib//cpp-netlib/<variant>pic
: <link>shared
<cxxflags>-fPIC
;
これは機能します。
boost::network
の記載はありませんが、cpp-netlib/boost/library
にサブフォルダがありますが、ヘッダーのみが含まれています。
質問:
私はcpp-netlib_pic
がboost_network
のPICのバージョンを使用する必要があることにCMakeをどのように伝えますか?
あなたがしようとしたことがありPICフラグ( 'bjam cxxflags = -fPIC')でブーストをビルドしますか? – rustyx
'boost_network'の画像と非画像の両方のバージョンがありますか? – Leon
@RustyXブーストライブラリが存在し、動作しています。私は同じソースが 'boost-build'を使ってうまくコンパイルすることを示すために質問を更新しました。これはCMakeを設定する際の問題です。 –