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
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
funcionó para mí.Respuestas:
Puede establecer la propiedad de código independiente de la posición en todos los objetivos:
o en una biblioteca específica:
Referencia: CMAKE_POSITION_INDEPENDENT_CODE cmake build system
fuente
CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
CMAKE_POSITION_INDEPENDENT_CODE
propiedad se establece de forma predeterminada para losSHARED
destinos, no es necesario establecerla explícitamente.set
comando (la primera versión anterior), entonces no. Si está utilizando la segunda versión, es por biblioteca, no por directorio.