CMAKE'de -fPIC derleyici seçeneğini eklemenin deyimsel yolu nedir?


120

Bunu yapmanın en az 3 yolu ile karşılaştım ve hangisinin deyimsel yol olduğunu merak ediyorum. Bunun neredeyse evrensel olarak herhangi bir statik kitaplığa yapılması gerekir. CMake'deki Makefile oluşturucunun bunu statik kitaplıklara otomatik olarak eklememesine şaşırdım. (bir şeyi kaçırmıyorsam?)

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

Başka varyasyonların da olabileceğine inanıyorum. (bulursanız lütfen sorumu düzenleyin)

Bu sorunun cevabını biliyorsanız, bir 3. taraf CMake projesinin CMakeLists.txt dosyasını değiştirmeden bu bayrakla derlenmesine neden olmanın bir yolu olup olmadığını da biliyor musunuz? Bu bayrağı olmayan statik kitaplıklarla karşılaştım. Statik bir kitaplığı dinamik bir kitaplıkta derlerken sorunlara neden olur.

Sen alırsın:

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

bu set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")benim için çalıştı.
Barracuda

Yanıtlar:


180

Konumdan bağımsız kod özelliğini tüm hedeflerde ayarlayabilirsiniz:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

veya belirli bir kitaplıkta:

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

Referans: CMAKE_POSITION_INDEPENDENT_CODE cmake derleme sistemi


İkinci yöntem, onu bir 3. taraf kitaplığa eklemenin doğru yolu gibi görünüyor. Mükemmel.
010110110101

Hrm - Bunu ExternalProject_Add tarafından eklenen bir projeye nasıl eklersiniz acaba?
010110110101

2
@ 010110110101 Çalışır mı bilmiyorum, ancak ExternalProject_Add seçeneğiyle belirtmeyi deneyebilirsinizCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus

12
CMAKE_POSITION_INDEPENDENT_CODEMülkiyet için varsayılan olarak ayarlanır SHAREDhedefler, açıkça ayarlamak için gerek yoktur.
robert

1
@Carbon set(yukarıdaki ilk sürüm) komutunu kullanıyorsanız, hayır. İkinci sürümü kullanıyorsanız, dizin başına değil kitaplık başına.
patrickvacek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.