Вот ссылка на мой проект, так, на всякий случай.
Итак, вот мой 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
для общих библиотек показывает их там.
Другим вариантом будет сборка gtest и gmock как части вашей основной сборки CMake, а не сборка их по отдельности и использование find_package () или find_library (). Это имеет ряд преимуществ, в том числе:
Недавно я написал статью о том, как загрузить и собрать gtest как часть вашей сборки. В отличие от наиболее часто предлагаемых подходов, в моей статье показано, как загрузить gtest во время настройки (т. Е. При запуске CMake), что затем позволяет вам использовать его в своем проекте с помощью add_subdirectory (). Это делает цели gtest и gtest_main CMake непосредственно доступными для вашего проекта, поэтому вы можете просто ссылаться на них, как и на любую другую библиотеку. Подход является общим и может работать на макет тоже. Вы можете найти эту статью здесь:
https://crascit.com/2015/07/25/cmake-gtest/
Обновить: Этот подход сейчас также часть документации googletest.
Библиотеки 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.