2016-07-10 52 views
23

Mi sono imbattuto in almeno 3 modi per farlo e mi chiedo quale sia la via idiomatica. Questo deve essere fatto quasi universalmente in qualsiasi libreria statica. Sono sorpreso che il generatore di Makefile in CMake non lo aggiunga automaticamente alle librerie statiche. (a meno che manchi qualcosa?)Qual è il modo idiomatico in CMAKE per aggiungere l'opzione -fPIC del compilatore?

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 varianti. (per favore modifica la mia domanda se ne trovi una)

Se sai la risposta a questa domanda, sai anche se c'è un modo per far compilare un progetto CMake di terze parti con questo flag senza modificarne la sua File CMakeLists.txt? Ho attraversato librerie statiche senza quel flag. Causa problemi durante la compilazione di una libreria statica in una libreria dinamica.

si ottiene:

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

risposta

47

È possibile impostare la proprietà posizione del codice indipendente su tutti gli obiettivi:

set(CMAKE_POSITION_INDEPENDENT_CODE ON) 

o in una specifica libreria:

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

Riferimento: CMAKE_POSITION_INDEPENDENT_CODEcmake build system

+0

Il secondo metodo sembra essere il modo giusto per aggiungerlo anche a una lib di terze parti. Perfezionare. – 010110110101

+0

Hrm - Mi chiedo come lo aggiungere ad un progetto aggiunto da ExternalProject_Add? – 010110110101

+1

@ 010110110101 Non so se funziona, ma puoi provare a specificare, su ExternalProject_Add con l'opzione 'CMAKE_CACHE_ARGS" -DCMAKE_POSITION_INDEPENDENT_CODE: BOOL = true "' – Amadeus