2016-07-10 17 views
23

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

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") 

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

この質問に対する答えを知っている場合は、サードパーティのCMakeプロジェクトにこのフラグを付けずにコンパイルさせる方法があるかどうかも知っていますか? CMakeLists.txtファイル?私は、そのフラグがない静的ライブラリを横断しました。静的ライブラリを動的ライブラリにコンパイルするときに問題が発生します。

あなたが得る:

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

答えて

47

あなたはすべてのターゲット上の位置に依存しないコードのプロパティを設定することができます。

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

+0

2番目の方法は、サードパーティ製のライブラリにも同様に追加することができます。完璧。 – 010110110101

+0

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

+1

@ 010110110101 CMAKE_COSETION_INDEPENDENT_CODE:BOOL = true "' – Amadeus

関連する問題