¿Cuál es la forma idiomática en CMAKE de agregar la opción del compilador -fPIC?

119

Me he encontrado con al menos 3 formas de hacer esto y me pregunto cuál es la forma idiomática. Esto debe realizarse de manera casi universal en cualquier biblioteca estática. Me sorprende que el generador Makefile en CMake no agregue esto automáticamente a las bibliotecas estáticas. (a menos que me falte algo?)

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

Creo que también puede haber otras variaciones. (edite mi pregunta si encuentra una)

Si conoce la respuesta a esta pregunta, ¿también sabe si hay una forma de hacer que un proyecto CMake de terceros se compile con esta bandera sin modificar su archivo CMakeLists.txt? Me he encontrado con bibliotecas estáticas que no tienen esa bandera. Causa problemas al compilar una biblioteca estática en una biblioteca dinámica.

Usted obtiene:

relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
010110110101
fuente
esto set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")funcionó para mí.
Barracuda

Respuestas:

179

Puede establecer la propiedad de código independiente de la posición en todos los objetivos:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

o en una biblioteca específica:

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

Referencia: CMAKE_POSITION_INDEPENDENT_CODE cmake build system

Amadeo
fuente
El segundo método parece ser la forma correcta de agregarlo también a una biblioteca de terceros. Perfecto.
010110110101
Hrm - Me pregunto cómo agregaría esto a un proyecto agregado por ExternalProject_Add.
010110110101
2
@ 010110110101 No sé si funciona, pero puede intentar especificar, en ExternalProject_Add con la opciónCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus
12
La CMAKE_POSITION_INDEPENDENT_CODEpropiedad se establece de forma predeterminada para los SHAREDdestinos, no es necesario establecerla explícitamente.
robert
1
@Carbon si está usando el setcomando (la primera versión anterior), entonces no. Si está utilizando la segunda versión, es por biblioteca, no por directorio.
patrickvacek