Почему cmake не находит gtest и gmock libs?

Вот ссылка на мой проект, так, на всякий случай.

Итак, вот мой CMakeLists.txt файл:

cmake_minimum_required (VERSION 2.6)
enable_testing()

project (IeiuniumTela)
set (IeiuniumTela_VERSION_MAJOR 1)
set (IeiuniumTela_VERSION_MINOR 0)
set (IeiuniumTela_VERSION_PATCH 0)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build/bin)

# TODO:  Make conditional for OS X compilation
set(CMAKE_CXX_COMPILER g++-4.7)
set(CMAKE_CC_COMPILER gcc-4.7)

# TODO:  Require gcc >= 4.7

set(SOURCES "${SOURCES}" "${CMAKE_BINARY_DIR}/src/http/request.cpp")
set(SOURCES "${SOURCES}" "${CMAKE_BINARY_DIR}/src/http/response.cpp")
set(SOURCES "${SOURCES}" "${CMAKE_BINARY_DIR}/src/http/server.cpp")
set(SOURCES "${SOURCES}" "${CMAKE_BINARY_DIR}/src/log.cpp")
set(SOURCES "${SOURCES}" "${CMAKE_BINARY_DIR}/src/main.cpp")

set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "-Wall ${CMAKE_CXX_FLAGS}")

add_executable(ieiunium_tela.srv ${SOURCES})

target_link_libraries(ieiunium_tela.srv yaml-cpp)
target_link_libraries(ieiunium_tela.srv boost_system-mt)

set(GTEST_DIR "${CMAKE_BINARY_DIR}/../gtest-1.6.0")
include_directories(SYSTEM "${GTEST_DIR}/include")
find_library(GTEST_LIBRARY
NAMES gtest
libgtest
libgtest.a
PATHS "${GTEST_DIR}")
find_library(GTEST_LIBRARY_MAIN
NAMES gtest_main
libgtest_main
libgtest.a
PATHS "${GTEST_DIR}")

set(GMOCK_DIR "${CMAKE_BINARY_DIR}/../gmock-1.6.0")
include_directories(SYSTEM "${GMOCK_DIR}/include")
include_directories(SYSTEM "${GMOCK_DIR}/gtest/include")
find_library(GMOCK_LIBRARY
NAMES gmock
libgmock
libgmock.a
PATHS "${GMOCK_DIR}")
find_library(GMOCK_LIBRARY_MAIN
NAMES gmock_main
libgmock_main
libgmock_main.a
PATHS "${GMOCK_DIR}")

set(TEST_SOURCES "${TEST_SOURCES}" "${CMAKE_BINARY_DIR}/test/unit/http/test_request.cpp")
set(TEST_SOURCES "${TEST_SOURCES}" "${CMAKE_BINARY_DIR}/test/unit/http/test_response.cpp")
set(TEST_SOURCES "${TEST_SOURCES}" "${CMAKE_BINARY_DIR}/test/unit/http/test_server.cpp")
set(TEST_SOURCES "${TEST_SOURCES}" "${CMAKE_BINARY_DIR}/test/unit/test_log.cpp")
set(TEST_SOURCES "${TEST_SOURCES}" "${CMAKE_BINARY_DIR}/test/unit/test_main.cpp")
add_executable(ieiunium_tela.srv_TEST ${TEST_SOURCES})
target_link_libraries(ieiunium_tela.srv_TEST ${GTEST_LIBRARY} ${GTEST_LIBRARY_MAIN})
target_link_libraries(ieiunium_tela.srv_TEST ${GMOCK_LIBRARY} ${GMOCK_LIBRARY_MAIN})

И вот мой вопрос: почему cmake не находит мои библиотеки gtest / gmock?

Я вошел в их соответствующие каталоги и построил их, используя ./configure && make -j4 и краткое find для общих библиотек показывает их там.

0

Решение

Другим вариантом будет сборка gtest и gmock как части вашей основной сборки CMake, а не сборка их по отдельности и использование find_package () или find_library (). Это имеет ряд преимуществ, в том числе:

  • Они построены с тем же компилятором и настройками, что и ваша основная сборка, поэтому не будет проблем с несовпадающими символами и т. Д.
  • Никаких ручных шагов перед сборкой не требуется, и нет необходимости указывать CMake, где искать что-то в вашем основном CMakeLists.txt.

Недавно я написал статью о том, как загрузить и собрать gtest как часть вашей сборки. В отличие от наиболее часто предлагаемых подходов, в моей статье показано, как загрузить gtest во время настройки (т. Е. При запуске CMake), что затем позволяет вам использовать его в своем проекте с помощью add_subdirectory (). Это делает цели gtest и gtest_main CMake непосредственно доступными для вашего проекта, поэтому вы можете просто ссылаться на них, как и на любую другую библиотеку. Подход является общим и может работать на макет тоже. Вы можете найти эту статью здесь:

https://crascit.com/2015/07/25/cmake-gtest/

Обновить: Этот подход сейчас также часть документации googletest.

1

Другие решения

Библиотеки gtest / gmock не собраны в настоящий корень этих проектов. Я полагаю, что в Linux они созданы для «lib» внутри корня.

Сказать CMake искать в «lib», но без изменения вашего GTEST_DIR или же GMOCK_DIR переменные, вы можете использовать PATH_SUFFIXES аргумент find_library команда:

find_library(GTEST_LIBRARY
NAMES gtest
libgtest
libgtest.a
PATHS "${GTEST_DIR}"PATH_SUFFIXES lib)

При необходимости вы можете добавить список суффиксов, чтобы указать значения, подходящие для сборок Windows.

Для поиска gtest предусмотрен стандартный модуль CMake (FindGTest). Вы могли бы посмотреть на код там для идей, или на самом деле использовать его вместо собственного кода. К сожалению, нет FindGMock модуль.

У меня есть пара других незначительных моментов.

Возможно, стоит рассмотреть возможность GTEST_DIR а также GMOCK_DIR переменные, которые будут установлены пользователем через -D флаг, чтобы позволить им существовать в любом месте относительно корня вашего проекта. В этом случае вы можете установить их только внутри CMakeLists.txt, если они еще не установлены.

Другим незначительным моментом является то, что GMock поставляется с включенным GTest. Вы мог просто разрешите пользователям собирать GMock, а затем находить и использовать версию внутри дерева GMock.

0

По вопросам рекламы [email protected]