Qual è il modo idiomatico in CMAKE per aggiungere l'opzione del compilatore -fPIC?


119

Mi sono imbattuto in almeno 3 modi per farlo e mi chiedo quale sia il modo idiomatico. Questo deve essere fatto quasi universalmente su qualsiasi libreria statica. Sono sorpreso che il generatore di Makefile in CMake non lo aggiunga automaticamente alle librerie statiche. (a meno che non mi manchi qualcosa?)

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

Credo che potrebbero esserci anche altre variazioni. (per favore modifica la mia domanda se ne trovi una)

Se ti capita di conoscere la risposta a questa domanda, sai anche se esiste un modo per far sì che un progetto CMake di terze parti venga compilato con questo flag senza modificare il suo file CMakeLists.txt? Mi sono imbattuto in librerie statiche senza quel flag. Causa problemi durante la compilazione di una libreria statica in una libreria dinamica.

Ottieni:

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

questo ha set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")funzionato per me.
Barracuda

Risposte:


179

È possibile impostare la proprietà del codice indipendente dalla posizione su tutti i target:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

o in una libreria specifica:

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

Riferimento: CMAKE_POSITION_INDEPENDENT_CODE cmake build system


Il secondo metodo sembra essere il modo giusto per aggiungerlo anche a una libreria di terze parti. Perfetto.
010110110101

Hrm - Mi chiedo come aggiungeresti questo a un progetto aggiunto da ExternalProject_Add?
010110110101

2
@ 010110110101 Non so se funziona, ma puoi provare a specificare, su ExternalProject_Add con opzioneCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus

12
La CMAKE_POSITION_INDEPENDENT_CODEproprietà è impostata di default per i SHAREDtarget, non è necessario impostarla esplicitamente.
robert

1
@ Carbon se stai usando il setcomando (la prima versione sopra), allora no. Se stai usando la seconda versione, è per libreria, non per directory.
patrickvacek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.