Apa cara idiomatis dalam CMAKE untuk menambahkan opsi kompilator -fPIC?

119

Saya telah menemukan setidaknya 3 cara untuk melakukan ini dan saya bertanya-tanya mana yang merupakan cara idiomatik. Ini perlu dilakukan hampir secara universal untuk semua perpustakaan statis. Saya terkejut bahwa generator Makefile di CMake tidak secara otomatis menambahkan ini ke pustaka statis. (kecuali saya melewatkan sesuatu?)

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

Saya yakin mungkin juga ada variasi lain. (harap edit pertanyaan saya jika Anda menemukannya)

Jika Anda mengetahui jawaban untuk pertanyaan ini, apakah Anda juga tahu jika ada cara yang menyebabkan proyek CMake pihak ketiga dikompilasi dengan tanda ini tanpa mengubah file CMakeLists.txt? Saya telah menemukan perpustakaan statis yang kehilangan bendera itu. Ini menyebabkan masalah saat menyusun pustaka statis menjadi pustaka dinamis.

Anda mendapatkan:

relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
010110110101
sumber
ini set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")berhasil untuk saya.
Barracuda

Jawaban:

179

Anda dapat mengatur properti kode posisi independen pada semua target:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

atau di perpustakaan tertentu:

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

Referensi: CMAKE_POSITION_INDEPENDENT_CODE cmake sistem build

Amadeus
sumber
Metode kedua tampaknya menjadi cara yang tepat untuk menambahkannya ke lib pihak ketiga juga. Sempurna.
010110110101
Hrm - Saya ingin tahu bagaimana Anda menambahkan ini ke proyek yang ditambahkan oleh ExternalProject_Add?
010110110101
2
@ 010110110101 Saya tidak tahu apakah ini berfungsi, tetapi Anda dapat mencoba menentukan, di ExternalProject_Add dengan opsiCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus
12
The CMAKE_POSITION_INDEPENDENT_CODEproperti diatur secara default untuk SHAREDtarget, tidak ada kebutuhan untuk mengatur secara eksplisit.
robert
1
@Carbon jika Anda menggunakan setperintah (versi pertama di atas), maka tidak. Jika Anda menggunakan versi kedua, itu per perpustakaan, bukan per direktori.
patrickvacek