Was ist die idiomatische Methode in CMAKE, um die Compileroption -fPIC hinzuzufügen?

118

Ich habe mindestens drei Möglichkeiten gefunden, dies zu tun, und ich frage mich, welche der idiomatische Weg ist. Dies muss nahezu universell für jede statische Bibliothek durchgeführt werden. Ich bin überrascht, dass der Makefile-Generator in CMake dies nicht automatisch zu statischen Bibliotheken hinzufügt. (es sei denn, ich vermisse etwas?)

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

Ich glaube, es könnte auch andere Variationen geben. (Bitte bearbeiten Sie meine Frage, wenn Sie eine finden)

Wenn Sie die Antwort auf diese Frage kennen, wissen Sie auch, ob es eine Möglichkeit gibt, ein CMake-Projekt eines Drittanbieters mit diesem Flag zu kompilieren, ohne die Datei CMakeLists.txt zu ändern? Ich bin auf statische Bibliotheken gestoßen, denen dieses Flag fehlt. Es verursacht Probleme beim Kompilieren einer statischen Bibliothek in eine dynamische Bibliothek.

Du erhältst:

relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
010110110101
quelle
das set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")hat bei mir funktioniert.
Barracuda

Antworten:

178

Sie können die positionsunabhängige Codeeigenschaft für alle Ziele festlegen:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

oder in einer bestimmten Bibliothek:

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

Referenz: CMAKE_POSITION_INDEPENDENT_CODE cmake Build-System

Amadeus
quelle
Die zweite Methode scheint der richtige Weg zu sein, um sie auch einer Drittanbieter-Bibliothek hinzuzufügen. Perfekt.
010110110101
Hrm - Ich frage mich, wie Sie dies einem von ExternalProject_Add hinzugefügten Projekt hinzufügen würden.
010110110101
2
@ 010110110101 Ich weiß nicht, ob es funktioniert, aber Sie können versuchen, bei ExternalProject_Add mit OptionCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus
12
Die CMAKE_POSITION_INDEPENDENT_CODEEigenschaft ist standardmäßig für SHAREDZiele festgelegt. Sie muss nicht explizit festgelegt werden.
Robert
1
@Carbon Wenn Sie den setBefehl verwenden (die erste Version oben), dann nein. Wenn Sie die zweite Version verwenden, erfolgt diese pro Bibliothek und nicht pro Verzeichnis.
Patrickvacek