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
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
berhasil untuk saya.Jawaban:
Anda dapat mengatur properti kode posisi independen pada semua target:
atau di perpustakaan tertentu:
Referensi: CMAKE_POSITION_INDEPENDENT_CODE cmake sistem build
sumber
CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
CMAKE_POSITION_INDEPENDENT_CODE
properti diatur secara default untukSHARED
target, tidak ada kebutuhan untuk mengatur secara eksplisit.set
perintah (versi pertama di atas), maka tidak. Jika Anda menggunakan versi kedua, itu per perpustakaan, bukan per direktori.