Eu descobri pelo menos 3 maneiras de fazer isso e estou me perguntando qual é a forma idiomática. Isso precisa ser feito quase universalmente em qualquer biblioteca estática. Estou surpreso que o gerador Makefile no CMake não adiciona isso automaticamente às bibliotecas estáticas. (a menos que esteja faltando alguma coisa?)
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")
Eu acredito que também pode haver outras variações. (por favor, edite minha pergunta se você encontrar uma)
Se você souber a resposta a esta pergunta, também sabe se há uma maneira de fazer com que um projeto CMake de terceiros seja compilado com este sinalizador sem modificar seu arquivo CMakeLists.txt? Eu encontrei bibliotecas estáticas sem esse sinalizador. Isso causa problemas ao compilar uma biblioteca estática em uma biblioteca dinâmica.
Você obtém:
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")
funcionou para mim.Respostas:
Você pode definir a propriedade do código independente da posição em todos os destinos:
ou em uma biblioteca específica:
Referência: CMAKE_POSITION_INDEPENDENT_CODE sistema de compilação cmake
fonte
CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
CMAKE_POSITION_INDEPENDENT_CODE
propriedade é definida por padrão paraSHARED
destinos, não há necessidade de defini-la explicitamente.set
comando (a primeira versão acima), então não. Se você estiver usando a segunda versão, é por biblioteca, não por diretório.