-fPIC 컴파일러 옵션을 추가하는 CMAKE의 관용적 방법은 무엇입니까?


119

나는 이것을하기위한 적어도 3 가지 방법을 발견했고 나는 어떤 것이 관용적 인 방법인지 궁금하다. 이것은 거의 모든 정적 라이브러리에 대해 거의 보편적으로 수행되어야합니다. CMake의 Makefile 생성기가이를 정적 라이브러리에 자동으로 추가하지 않는다는 사실에 놀랐습니다. (내가 놓친 게 아니라면?)

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

다른 변형이있을 수도 있다고 생각합니다. (찾으면 내 질문을 수정하십시오)

이 질문에 대한 답을 아는 경우 CMakeLists.txt 파일을 수정하지 않고 타사 CMake 프로젝트가이 플래그로 컴파일되도록하는 방법이 있는지 알고 있습니까? 해당 플래그가 누락 된 정적 라이브러리를 실행했습니다. 정적 라이브러리를 동적 라이브러리로 컴파일 할 때 문제가 발생합니다.

당신은 얻을 :

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

답변:


179

모든 타겟에서 위치 독립적 코드 속성을 설정할 수 있습니다.

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 빌드 시스템


두 번째 방법은 타사 라이브러리에도 추가하는 올바른 방법 인 것 같습니다. 완전한.
010110110101

Hrm-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
@Carbon set명령을 사용하는 경우 (위의 첫 번째 버전), 아니요. 두 번째 버전을 사용하는 경우 디렉토리가 아닌 라이브러리 당입니다.
patrickvacek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.