0

念のため、私のプロジェクトへのリンクを次に示します。

だから、ここに私の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

4

2 に答える 2

1

もう 1 つのオプションは、gtest と gmock を別々にビルドして find_package() または find_library() を使用するのではなく、メインの CMake ビルドの一部としてビルドすることです。これには、次のような利点があります。

  • これらはメイン ビルドと同じコンパイラと設定でビルドされるため、シンボルの不一致などの問題は発生しません。
  • ビルドの前に手動で手順を実行する必要はなく、メインの CMakeLists.txt 内の場所を CMake に指示する必要もありません。

最近、ビルドの一部として gtest をダウンロードしてビルドする方法についての記事を書きました。より一般的に提案されているアプローチとは異なり、私の記事では、構成時 (つまり、CMake の実行時) に gtest をダウンロードする方法を示します。これにより、add_subdirectory() を使用してプロジェクトに取り込むことができます。これにより、gtest および gtest_main CMake ターゲットがプロジェクトで直接使用できるようになるため、他のライブラリと同様にそれらに対してリンクすることができます。このアプローチは一般的であり、モックでも機能する可能性があります。その記事はここにあります:

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

更新:このアプローチは現在、googletest のドキュメントにも含まれています。

于 2015-07-25T22:54:41.647 に答える
0

gtest/gmock ライブラリは、これらのプロジェクトの実際のルートにはビルドされません。Linuxでは、ルート内の「lib」に構築されていると思います。

GTEST_DIRまたは変数を変更せずに「lib」で検索するように CMake に指示するには、コマンドの引数をGMOCK_DIR使用できます。PATH_SUFFIXESfind_library

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

必要に応じて、サフィックスのリストを追加して、Windows ビルドに適した値を指定することもできます。

gtest を検索するための標準 CMake モジュールが提供されています ( FindGTest)。そこにあるコードを見てアイデアを得るか、独自のコードの代わりに実際に使用することができます。残念ながらFindGMockモジュールはありません。

他にもいくつかマイナーな点があります。

プロジェクトのルートに関連する任意の場所に存在できるように、フラグを介してユーザーが変数GTEST_DIRと変数を設定できるようにすることを検討する価値があるかもしれません。その場合、それらがまだ設定されていない場合にのみ、CMakeLists.txt 内に設定します。GMOCK_DIR-D

もう 1 つの小さな点は、GMock には GTest が含まれていることです。ユーザーに GMock のビルドを許可し、GMock ツリー内でそのバージョンを見つけて使用することができます。

于 2013-07-01T08:41:22.113 に答える