วิธีสำนวนใน CMAKE ในการเพิ่มตัวเลือกคอมไพเลอร์ -fPIC คืออะไร?


120

ฉันเจออย่างน้อย 3 วิธีในการทำสิ่งนี้และฉันสงสัยว่าวิธีใดเป็นสำนวน สิ่งนี้จำเป็นต้องดำเนินการในระดับสากลกับไลบรารีแบบคงที่ ฉันแปลกใจที่ตัวสร้าง Makefile ใน CMake ไม่เพิ่มสิ่งนี้ลงในไลบรารีแบบคงที่โดยอัตโนมัติ (เว้นแต่ฉันจะพลาดอะไรไป?)

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

ฉันเชื่อว่าอาจมีรูปแบบอื่น ๆ (โปรดแก้ไขคำถามของฉันหากคุณพบ)

หากคุณทราบคำตอบสำหรับคำถามนี้คุณทราบหรือไม่ว่ามีวิธีใดที่จะทำให้โครงการ CMake ของบุคคลที่สามถูกคอมไพล์ด้วยแฟล็กนี้โดยไม่ต้องแก้ไขไฟล์ CMakeLists.txt ฉันทำงานข้ามไลบรารีแบบคงที่โดยไม่มีแฟล็กนั้น ทำให้เกิดปัญหาเมื่อรวบรวมไลบรารีแบบคงที่ลงในไลบรารีไดนามิก

คุณได้รับ:

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")ได้ผลสำหรับฉัน
Barracuda

คำตอบ:


180

คุณสามารถตั้งค่าคุณสมบัติรหัสตำแหน่งที่เป็นอิสระในทุกเป้าหมาย:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

หรือในไลบรารีเฉพาะ:

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

ข้อมูลอ้างอิง: CMAKE_POSITION_INDEPENDENT_CODE ระบบสร้าง cmake


วิธีที่สองดูเหมือนจะเป็นวิธีที่ถูกต้องในการเพิ่มลงใน lib ของบุคคลที่สามเช่นกัน สมบูรณ์
010110110101

หืม - ฉันสงสัยว่าคุณจะเพิ่มสิ่งนี้ลงในโปรเจ็กต์ที่ ExternalProject_Add เพิ่มได้อย่างไร?
010110110101

2
@ 010110110101 ฉันไม่ทราบว่ามันใช้งานได้หรือไม่ แต่คุณสามารถลองระบุได้ที่ ExternalProject_Add พร้อมตัวเลือกCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus

12
CMAKE_POSITION_INDEPENDENT_CODEตั้งค่าคุณสมบัติโดยเริ่มต้นสำหรับSHAREDเป้าหมายไม่มีความจำเป็นที่จะตั้งชัดเจน
robert

1
@ คาร์บอนหากคุณใช้setคำสั่ง (เวอร์ชันแรกด้านบน) แสดงว่าไม่ หากคุณใช้เวอร์ชันที่สองจะเป็นตามไลบรารีไม่ใช่ตามไดเรกทอรี
patrickvacek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.