2017-03-07 1 views
1

많은 서브 프로젝트가있는 프로젝트가 있으며, 그 중 하나는 Google 테스트 프로젝트입니다. 기본 프로젝트를 빌드 할 때마다 공유 라이브러리로 Google 테스트 라이브러리를 빌드해야하지만 Google 테스트를 공유로 빌드하는 단일 방법은 글로벌 옵션 "BUILD_SHARED_LIBS=ON"을 설정하는 것입니다. 불행하게도 다른 프로젝트가이 옵션에 의존합니다. 그럼,이 경우 공유 라이브러리로 구글 테스트를 구축하는 방법? Google 테스트 빌드 공유 라이브러리

나는

add_library(gtest SHARED src/gtest-all.cc) 
add_library(gtest_main "SHARED src/gtest_main.cc) 

cxx_library(gtest "${cxx_strict}" src/gtest-all.cc) 
cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc) 

을 대체하는 시도했지만 아무 효과가 없습니다.

+0

[GTest 및 GMock으로 테스트 : 정적 라이브러리와 정적 라이브러리] 가능한 복제본 (http://stackoverflow.com/questions/21237341/testing-with-gtest-and-gmock-shared-vs-static-libraries) –

+0

gefore SHARED는 무엇입니까? – usr1234567

답변

1

두 가지 가능성 : 당신이 gtest 소스를 변경하는 자유에없는 경우, gtest에 대한 add_subdirectory 호출하기 전에 BUILD_SHARED_LIBS 옵션을 설정 한 후 즉시 다시 재설정 : 당신이 원하는 경우,

set(BUILD_SHARED_LIBS_OLD ${BUILD_SHARED_LIBS}) 
set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCED) 
add_subdirectory(gtest) 
set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_OLD} CACHE BOOL "" FORCED) 

또는 gtest 소스를 변경하려면 cxx_shared_library()에 전화로 cxx_library()를 교체하십시오 cxx_library_* 매크로 some additional stuff을 설정하기 때문에

cxx_shared_library(gtest "${cxx_strict}" src/gtest-all.cc) 

이가 필요합니다 그 빌드는 보통 add_library이 그리울 것입니다.

gtest_main은 프로그램에 대한 진입 점 (별칭 main())을 정의하고이를 공유 라이브러리로 이동하면 의도 한 효과가 없을 수 있으므로 정적 라이브러리로 유지하려는 경우가 있습니다.

+0

먼저 나를 위해 잘 작동합니다. 그러나 두 번째는 링커 오류를 생성합니다. – voltento

+0

@voltento 어떤 링커 오류입니까? 런타임 함수에 충돌이 생기면 Windows에서'gtest_force_shared_crt'를 설정해야 할 수도 있지만 그렇지 않으면 잘 작동 할 것입니다. 어쨌든 첫 번째 해결 방법은 덜 바람직하기 때문에 아마도 바람직 할 것입니다. – ComicSansMS

1

googletest 프로젝트를 실행하고 그 후에 변수를 복원하기 전에 변수 BUILD_SHARED_LIBS을 원하는 값으로 설정하십시오.

googletest이 옵션으로 BUILD_SHARED_LIBS (즉, 변수를 캐시)가 googletest의 포함하기 전에 변수에 초기 캐시 값을 할당하는 것이 좋습니다 정의하므로.

# Need to assign value for cache variable explicitely. 
option(BUILD_SHARED_LIBS "Build shared libraries" OFF) 
... 
# Store old value 
set(BUILD_SHARED_LIBS_OLD ${BUILD_SHARED_LIBS}) 
# Assign desired value for subproject 
set(BUILD_SHARED_LIBS ON) 
# Step into subproject 
add_subdirectory(gtest) 
# Restore old value 
set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_OLD}) 

주, 임시 값의 사용자가 캐시를 수정하지 않아도 변경이 : 일반 변수을 설정하기에 충분하다. 이것은 같은 이름의 일반 변수와 캐시 변수를 처리하는 CMake 정책 때문에 가능합니다.

관련 문제