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


119

私はこれを行うために少なくとも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

これset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")は私のために働いた。
Barracuda、

回答:


179

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

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

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

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

リファレンス:CMAKE_POSITION_INDEPENDENT_CODE cmakeビルドシステム


2番目の方法は、サードパーティのlibにも追加するための正しい方法のようです。完璧です。
010110110101 2016

Hrm-ExternalProject_Addによって追加されたプロジェクトにこれをどのように追加しますか?
010110110101

2
@ 010110110101機能するかどうかはわかりませんが、ExternalProject_Addをオプション付きで指定してみてくださいCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus

12
このCMAKE_POSITION_INDEPENDENT_CODEプロパティはデフォルトでSHAREDターゲットに設定されます。明示的に設定する必要はありません。
ロバート

1
setコマンド(上記の最初のバージョン)を使用している場合は@Carbon、そうでない場合。2番目のバージョンを使用している場合は、ディレクトリごとではなく、ライブラリごとです。
patrickvacek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.