Tôi đã xem qua ít nhất 3 cách để làm điều này và tôi đang tự hỏi đâu là cách thành ngữ. Điều này cần được thực hiện gần như phổ biến đối với bất kỳ thư viện tĩnh nào. Tôi ngạc nhiên rằng trình tạo Makefile trong CMake không tự động thêm nó vào các thư viện tĩnh. (trừ khi tôi thiếu thứ gì đó?)
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")
Tôi tin rằng cũng có thể có các biến thể khác. (vui lòng chỉnh sửa câu hỏi của tôi nếu bạn tìm thấy)
Nếu bạn tình cờ biết câu trả lời cho câu hỏi này, bạn cũng biết liệu có cách nào khiến dự án CMake của bên thứ 3 được biên dịch với cờ này mà không sửa đổi tệp CMakeLists.txt của nó không? Tôi đã chạy qua các thư viện tĩnh thiếu cờ đó. Nó gây ra sự cố khi biên dịch thư viện tĩnh thành thư viện động.
Bạn lấy:
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")
đã làm việc cho tôi.