2016-08-28 13 views
2

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-netlibboost_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_picboost_networkのPICのバージョンを使用する必要があることにCMakeをどのように伝えますか?

+1

あなたがしようとしたことがありPICフラグ( 'bjam cxxflags = -fPIC')でブーストをビルドしますか? – rustyx

+0

'boost_network'の画像と非画像の両方のバージョンがありますか? – Leon

+0

@RustyXブーストライブラリが存在し、動作しています。私は同じソースが 'boost-build'を使ってうまくコンパイルすることを示すために質問を更新しました。これはCMakeを設定する際の問題です。 –

答えて

2

これは、代わりにプロパティを指定する正しい構文

を使用しない場合だけです。

set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE) 

あなたはONそれを有効にする必要があります:

set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE ON) 
関連する問題