2

CMake:

cpp-netlibに依存しています。

ビルドシステムの一部としてソースからビルドします。

cpp-netlib/CMakeLists.txt:

add_library(cpp-netlib
    STATIC
    ${SRCS})

1 つの特定のユース ケースでは、共有ライブラリで使用する必要があるため、-fPIC有効にして 2 つ目のライブラリを作成しました。

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の非picバージョンに対してリンクしようとしているため、リンカーエラーが返されます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

分解された名前:

$ c++filt _ZTVN5boost7network4http4impl15normal_delegateE
vtable for boost::network::http::impl::normal_delegate

ブーストビルド:

これはすべて、既存のビルド システムを boost-build から CMake に移行することの一部です。

ブーストビルド Jamfile は正常に動作します。

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の pic バージョンを使用する必要があることを CMake に伝えるにはどうすればよいboost_networkですか?

4

1 に答える 1

2

これは、正しい構文を使用していない場合にすぎません

プロパティを指定する代わりに:

set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE)

あなたはそれを回す必要がありますON

set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE ON)
于 2016-08-28T22:17:29.923 に答える