2013-07-04 46 views
8

Đây là CMakeLists.txt tôi:CMake không thể tìm thấy một thư viện cần

cmake_minimum_required(VERSION 2.6) 

# Locate GTest 
find_package(GTest REQUIRED) 
include_directories(/usr/include/gtest) 

# Link runTests with what we want to test and the GTest and pthread library 
add_executable(runTests gtest.cpp) 
target_link_libraries(runTests /usr/lib/gtest pthread) 

Khi chạy cmake tôi nhận được lỗi sau:

[email protected]:~/workspace/gtest/src$ cmake CMakeLists.txt 
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (message): 
    Could NOT find GTest (missing: GTEST_LIBRARY GTEST_MAIN_LIBRARY) 
Call Stack (most recent call first): 
    /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:291 (_FPHSA_FAILURE_MESSAGE) 
    /usr/share/cmake-2.8/Modules/FindGTest.cmake:150 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) 
    CMakeLists.txt:8 (find_package) 

Làm thế nào để giải quyết này?

Trả lời

11

Bạn đã nhận nó ngược. Cuộc gọi find_package là nghĩa vụ phải tìm vị trí của thư viện gtest cho bạn. Bạn sẽ không cần chỉ định đường dẫn bao gồm và thư viện theo cách thủ công nữa:

# Locate GTest 
find_package(GTest REQUIRED) 
include_directories(${GTEST_INCLUDE_DIRS}) 

# Link runTests with what we want to test and the GTest and pthread library 
add_executable(runTests my_test.cpp) 
target_link_libraries(runTests ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} pthread) 

Hãy xem FindGTest.cmake trong thư mục mô-đun CMake của bạn để biết chi tiết.

Sự cố tại sao bạn nhận được thông báo lỗi là find_package(GTest REQUIRED) không thể tìm thấy gtest trên hệ thống của bạn. Với tham số REQUIRED, bạn đã yêu cầu CMake thất bại ngay lập tức nếu không tìm thấy thư viện (đây thực sự là điều đúng để làm ở đây).

Vì vậy, những gì bạn cần làm là cung cấp FindGTest với các phương tiện để định vị thư viện của bạn. Thật không may, không có cách tiêu chuẩn để làm điều này, vì thông tin cần thiết để tìm một thư viện khác nhau từ thư viện đến thư viện. Vì vậy, bạn sẽ phải kiểm tra nguồn của kịch bản tìm kiếm.

Điều này sẽ cho bạn biết rằng FindGTest dựa vào biến môi trường GTEST_ROOT để tìm thư viện. Đặt biến môi trường đó thành đường dẫn cài đặt gtest của bạn, chạy lại CMake và bạn sẽ ổn.

Nếu bố cục của cài đặt khác với bố cục FindGTest, bạn có thể phải viết tập lệnh tìm của riêng mình thay thế. Các kịch bản tìm thấy đi kèm với CMake thường khá tốt, nhưng đôi khi chúng không hoạt động trên một số nền tảng nhất định. Nếu bạn có thể đưa ra một bản vá bổ sung hỗ trợ cho nền tảng của mình, thường không có vấn đề gì để nó được tích hợp với bản phân phối CMake chính thức.

Lưu ý rằng nếu bạn có ý định tự xây dựng chính mình (thay vì sử dụng các tệp nhị phân do hệ điều hành của bạn cung cấp) thì sử dụng tập lệnh tìm không phải là ý tưởng hay nhất ngay từ đầu. Thay vào đó, bạn nên sử dụng một số imported target.

+1

Tôi đã cài đặt tiêu đề gtest đến/usr/inculde/gtest và thư viện đến/usr/lib/gtest. Vậy GTEST_ROOT là gì? Tôi vẫn còn bối rối với điều này. – friko

+1

Giả sử bạn đang sử dụng [tập lệnh tìm kiếm từ CMake 2.8.11] (http://cmake.org/gitweb?p=cmake.git;a=blob;f=Modules/FindGTest.cmake;h=d531dd12d90fc0bdbb2fba424c448f4e9f69f4bf;hb = 0ad0c37206fce114c4e4c31f5270b53e181ab3c2), 'GTEST_ROOT' của bạn sẽ phải là'/usr'. Kịch bản đó sử dụng 'include' và' lib' làm hậu tố cho thư mục bao gồm và lib tương ứng, vì vậy bạn nên ổn. – ComicSansMS

+0

xuất GTEST_ROOT =/usr sau lệnh đó lệnh của tôi vẫn không thành công với cùng lý do .. – friko

Các vấn đề liên quan