Base the GoogleTest DLL import on its library type GTEST_LINKED_AS_SHARED_LIBRARY was defined whenever Ceres was built as a shared library. Building against a static GoogleTest then made the tests import GoogleTest symbols from a DLL that does not exist. Define it only if the bundled GoogleTest is a shared library, since imported GoogleTest targets already propagate it themselves. Change-Id: I4b4879d4283c20646e6b38a7b06760639e3c4637
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt index d7e1ff5..61092b7 100644 --- a/internal/ceres/CMakeLists.txt +++ b/internal/ceres/CMakeLists.txt
@@ -361,9 +361,13 @@ target_compile_definitions(test_util PUBLIC CERES_HAS_GTEST) target_compile_definitions(test_util PRIVATE CERES_TEST_SRCDIR_SUFFIX="../../data") - if (BUILD_SHARED_LIBS) + # GoogleTest built as part of Ceres provides the definition only to consumers + # of its installed package. Imported targets already provide it. + get_target_property(_Ceres_GTEST_TYPE GTest::gtest TYPE) + if (_Ceres_GTEST_TYPE STREQUAL SHARED_LIBRARY) target_compile_definitions(test_util PUBLIC GTEST_LINKED_AS_SHARED_LIBRARY=1) - endif (BUILD_SHARED_LIBS) + endif (_Ceres_GTEST_TYPE STREQUAL SHARED_LIBRARY) + unset(_Ceres_GTEST_TYPE) macro (CERES_TEST NAME) add_executable(${NAME}_test ${NAME}_test.cc)