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
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
hat bei mir funktioniert.Antworten:
Sie können die positionsunabhängige Codeeigenschaft für alle Ziele festlegen:
oder in einer bestimmten Bibliothek:
Referenz: CMAKE_POSITION_INDEPENDENT_CODE cmake Build-System
quelle
CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
CMAKE_POSITION_INDEPENDENT_CODE
Eigenschaft ist standardmäßig fürSHARED
Ziele festgelegt. Sie muss nicht explizit festgelegt werden.set
Befehl verwenden (die erste Version oben), dann nein. Wenn Sie die zweite Version verwenden, erfolgt diese pro Bibliothek und nicht pro Verzeichnis.