web-dev-qa-db-ja.com

-fPICコンパイラオプションを追加するCMAKEの慣用的な方法は何ですか?

私はこれを行うために少なくとも3つの方法に出くわしましたが、どちらが慣用的な方法なのか疑問に思っています。これは、すべての静的ライブラリに対してほぼ普遍的に行う必要があります。 CMakeのMakefileジェネレーターがこれを静的ライブラリに自動的に追加しないことに驚いています。 (何かが足りない場合は?)

target_compile_options(myLib PRIVATE -fPIC)

add_compile_options(-fPIC)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")

他のバリエーションもあると思います。 (質問が見つかったら編集してください)

この質問への答えを知っている場合、CMakeLists.txtファイルを変更せずにサードパーティのCMakeプロジェクトをこのフラグでコンパイルする方法があるかどうかも知っていますか?そのフラグが欠落している静的ライブラリに出くわしました。静的ライブラリを動的ライブラリにコンパイルするときに問題が発生します。

あなたが得る:

relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
78
010110110101

すべてのターゲットで位置に依存しないコードプロパティを設定できます。

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

または特定のライブラリ内:

add_library(lib1 SHARED lib1.cpp)
set_property(TARGET lib1 PROPERTY POSITION_INDEPENDENT_CODE ON)

リファレンス: CMAKE_POSITION_INDEPENDENT_CODEcmake build system

127
Amadeus