Qual é a maneira idiomática no CMAKE de adicionar a opção do compilador -fPIC?

119

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
010110110101
fonte
isso set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")funcionou para mim.
Barracuda

Respostas:

179

Você pode definir a propriedade do código independente da posição em todos os destinos:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

ou em uma biblioteca específica:

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

Referência: CMAKE_POSITION_INDEPENDENT_CODE sistema de compilação cmake

Amadeus
fonte
O segundo método parece ser a maneira certa de adicioná-lo a uma biblioteca de terceiros também. Perfeito.
010110110101
Hrm - Eu me pergunto como você adicionaria isso a um projeto adicionado por ExternalProject_Add?
010110110101
2
@ 010110110101 Não sei se funciona, mas você pode tentar especificar, em ExternalProject_Add com a opçãoCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus
12
A CMAKE_POSITION_INDEPENDENT_CODEpropriedade é definida por padrão para SHAREDdestinos, não há necessidade de defini-la explicitamente.
robert
1
@Carbon se você estiver usando o setcomando (a primeira versão acima), então não. Se você estiver usando a segunda versão, é por biblioteca, não por diretório.
patrickvacek