Cách thiết lập Khung kiểm tra C ++ của Google (gtest) với Visual Studio 2005


Câu trả lời:


44

Những gì Arlaharen nói về cơ bản là đúng, ngoại trừ việc anh ấy bỏ qua phần giải thích lỗi trình liên kết của bạn. Trước hết, bạn cần xây dựng ứng dụng của mình mà không có CRT làm thư viện thời gian chạy. Dù sao thì bạn cũng nên làm điều này, vì nó thực sự đơn giản hóa việc phân phối ứng dụng của bạn. Nếu bạn không làm điều này, thì tất cả người dùng của bạn cần cài đặt Thư viện thời gian chạy Visual C ++ và những người không phàn nàn về việc mất tích DLL bí ẩn trên hệ thống của họ ... với vài trăm kilobyte bổ sung mà nó phải trả để liên kết trong CRT tĩnh, bạn sẽ đỡ phải đau đầu sau này khi hỗ trợ (tin tưởng tôi về điều này - tôi đã học được nó một cách khó khăn!).

Dù sao, để thực hiện việc này, bạn đi tới thuộc tính của mục tiêu -> C / C ++ -> Tạo mã -> Thư viện thời gian chạy và nó cần được đặt là "Đa luồng" cho bản phát hành của bạn và "Gỡ lỗi đa luồng" cho bản dựng Gỡ lỗi của bạn.

Vì thư viện gtest được xây dựng theo cùng một cách, bạn cần đảm bảo rằng bạn đang liên kết với phiên bản chính xác của , nếu không trình liên kết sẽ lấy một bản sao khác của thư viện thời gian chạy, đó là lỗi bạn đã thấy (btw, điều này sẽ không tạo ra sự khác biệt nếu bạn đang sử dụng MFC). Bạn cần xây dựng gtest dưới dạng cả hai chế độ Gỡ lỗi và Phát hành và giữ cả hai bản sao. Sau đó, bạn liên kết với gtest.lib / gtest_main.lib trong bản dựng Phát hành và gtestd.lib / gtest_maind.lib trong bản dựng Gỡ lỗi của bạn.

Ngoài ra, bạn cần đảm bảo rằng ứng dụng của bạn trỏ đến thư mục lưu trữ tệp tiêu đề gtest (trong thuộc tính -> C / C ++ -> Chung -> Thư mục bao gồm bổ sung), nhưng nếu bạn gặp lỗi trình liên kết, tôi giả sử mà bạn đã quản lý để sửa phần này, nếu không, bạn sẽ có nhiều lỗi trình biên dịch hơn phải giải quyết trước.


Tôi đã học được điều này một cách "khó khăn", dành cả ngày. Cuối cùng, tôi đã làm cho nó hoạt động, sau khi xây dựng cả hai theo cùng một cách. Cảm ơn vì câu trả lời của bạn, nhưng đã muộn. : / Và BTW, đề xuất CRT của bạn là sai, nhưng tôi không có đủ không gian để thảo luận về điều này. Xem tinyurl.com/dj5k7k
knaser 11/02/09

tốt nếu bạn đã học nó theo cách "khó", bạn có thể quên rằng các dll thời gian chạy CRT được gọi là "có thể phân phối lại" ... vì vậy bạn rõ ràng là bạn phải tự phân phối lại chúng ... bằng cách bao gồm trình cài đặt phân phối lại trong trình cài đặt của riêng bạn hoặc bằng cách đơn giản giải nén các file dll cần thiết trong thư mục cài đặt của riêng bạn ... (trong đó có một file manifest nếu cần)
smerlin

1
Liên kết tĩnh CRT có nghĩa là ứng dụng của bạn sẽ không nhận các bản sửa lỗi khai thác / bảo mật
paulm

106

(Các hướng dẫn này giúp khung thử nghiệm hoạt động cho cấu hình Gỡ lỗi. Sẽ khá đơn giản nếu áp dụng cùng một quy trình cho cấu hình Bản phát hành.)

Nhận Khung kiểm tra C ++ của Google

  1. Tải xuống khung gtest mới nhất
  2. Giải nén thành C:\gtest

Xây dựng Thư viện Khung

  1. Mở C:\gtest\msvc\gtest.slntrong Visual Studio
  2. Đặt cấu hình thành "Gỡ lỗi"
  3. Xây dựng giải pháp

Tạo và cấu hình dự án thử nghiệm của bạn

  1. Tạo giải pháp mới và chọn mẫu Visual C ++> Win32> Ứng dụng bảng điều khiển Win32
  2. Nhấp chuột phải vào dự án mới tạo và chọn Thuộc tính
  3. Thay đổi Cấu hình thành Gỡ lỗi.
  4. Thuộc tính cấu hình> C / C ++> Chung> Thư mục Bao gồm Bổ sung: Thêm C:\gtest\include
  5. Thuộc tính cấu hình> C / C ++> Tạo mã> Thư viện thời gian chạy: Nếu mã của bạn liên kết đến một DLL thời gian chạy, hãy chọn Gỡ lỗi đa luồng DLL (/ MDd). Nếu không, hãy chọn Gỡ lỗi đa luồng (/ MTd).
  6. Thuộc tính cấu hình> Trình liên kết> Chung> Thư mục Thư viện Bổ sung: Thêm C:\gtest\msvc\gtest\Debughoặc C:\gtest\msvc\gtest-md\Debug, tùy thuộc vào vị trí của gtestd.lib
  7. Thuộc tính cấu hình> Trình liên kết> Đầu vào> Phụ thuộc bổ sung: Thêm gtestd.lib

Xác minh mọi thứ hoạt động

  1. Mở cpp trong Dự án thử nghiệm của bạn có chứa main()hàm.
  2. Dán mã sau:

    #include "stdafx.h"  
    #include <iostream>
    
    #include "gtest/gtest.h"
    
    TEST(sample_test_case, sample_test)
    {
        EXPECT_EQ(1, 1);
    }
    
    int main(int argc, char** argv) 
    { 
        testing::InitGoogleTest(&argc, argv); 
        RUN_ALL_TESTS(); 
        std::getchar(); // keep console window open until Return keystroke
    }
    
  3. Gỡ lỗi> Bắt đầu gỡ lỗi

Nếu mọi thứ đều hoạt động, bạn sẽ thấy cửa sổ bảng điều khiển xuất hiện và hiển thị cho bạn kết quả kiểm tra đơn vị.


9
đó là một hướng dẫn tuyệt vời! Tôi đã có thể hiểu được quả bóng lăn, nhưng tôi sẽ thêm một lưu ý nữa ở đó: dự án thử nghiệm và thư viện gtest phải được xây dựng với cùng một tùy chọn Tạo mã, cả hai đều là / MDd hoặc cả hai đều là / MTd, nếu không sẽ là một loạt các lỗi liên kết.
Kiril

1
Lưu ý: Bất cứ ai đang cố gắng thực hiện việc triển khai tương tự này với Microsoft Visual Studio .Net 2003, các thư viện Khung kiểm tra của Google sẽ tự động đặt mặc định Thư viện thời gian chạy thành ' Gỡ lỗi đơn luồng ' cho chế độ Gỡ lỗi và ' Một luồng ' cho Chế độ phát hành và như Theo như tôi đã thử, không có tùy chọn để thay đổi nó từ Tạo mã. Vì vậy, hãy đảm bảo rằng bạn chọn tùy chọn Đơn luồng làm thư viện thời gian chạy trong dự án của mình. Ngoài ra, hướng dẫn đơn giản và ngắn này hoạt động hoàn hảo!
Neophile

Đây là bài hướng dẫn đầu tiên trong số 5 bài hướng dẫn hoạt động hiệu quả và không thúc đẩy một cách thực hành xấu. Tôi rất thích nếu điều này đề cập đến khía cạnh quan trọng của việc liên kết dự án thử nghiệm với dự án ban đầu ... Hơn 30 trang web sau đó, tôi vẫn chưa tìm thấy câu trả lời hiệu quả. Tôi đã dành 3 ngày cho nó.
person27

Tôi đã gỡ bỏ giá trị trong "Project Properties> Configuration Properties> C / C ++> Runtime Library", sau đó nó làm việc
Manohar Reddy Poreddy


5

Sau khi xây dựng gtest, đây là những gì tôi đã làm:

  1. Thêm \ mypath \ gtest-1.0.1 \ Debug (hoặc Phát hành) vào Thuộc tính chung-> Trình liên kết-> Chung-> Thư mục Thư viện bổ sung
  2. Thêm gtest.lib và gtest_main.lib vào Thuộc tính chung-> Trình liên kết-> Đầu vào-> Phụ thuộc bổ sung

Sau đó, tôi chỉ viết các bài kiểm tra của mình bằng TEST hoặc TEST_F nếu thích hợp và biên dịch chúng cùng với hàm chính của tôi:

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

5
Tôi gặp nhiều lỗi trình liên kết: đã được xác định trong gtest.lib ... ví dụ: 1> LIBCMT.lib (tidtable.obj): lỗi LNK2005: __encode_pointer đã được xác định trong msvcrt.lib (MSVCR80.dll) Ồ, btw, I tôi đang cố gắng viết các bài kiểm tra cho một mã MFC.
knaser

Lấy làm tiếc. Tôi không nghĩ rằng tôi có thể giúp bạn ở đó. Vì một số lý do tôi không nhận được những lỗi liên kết. Bạn đã thử xây dựng chỉ một bài kiểm tra hello world với gtest chưa?
Arlaharen

gtest_main.libchứa hàm mặc định main, vì vậy bạn có thể không muốn bao gồm nó nếu bạn đã viết một maincách rõ ràng cho riêng mình .
Groo

5

Nếu bạn không muốn viết main () của riêng mình cho các bài kiểm tra, bạn có thể sử dụng hàm main () được định nghĩa trong gtest_main.lib nhưng sau đó bạn gặp lỗi trình liên kết "Điểm mục nhập phải được xác định" trong VS2012. Trong dự án thử nghiệm của bạn, đặt ProjectProperties-> Linker-> System-> SubSystem thành "Console" vì điều này sẽ buộc VS2012 phải tìm kiếm một điểm nhập có tên là "main ()" và sẽ tìm thấy nó trong gtest_main.lib (miễn là bạn đã liên kết nó vào đúng cách).


2

Trong Microsoft Visual Studio, loại thư viện thời gian chạy được định cấu hình sai gây ra lỗi liên kết.

VS 2005 (và 2008) sử dụng DLL đa luồng hoặc DLL gỡ lỗi đa luồng làm mặc định. Nhưng thư viện Kiểm tra của Google sử dụng thời gian chạy gỡ lỗi Mulithreaded hoặc Mulithreaded làm mặc định.

Vì vậy, hãy chọn loại thư viện thời gian chạy thích hợp cho thư viện thử nghiệm của google. (trong thuộc tính Cấu hình -> Tạo mã -> Thư viện thời gian chạy).


thời gian chạy thích hợp là gì? (MD hoặc khác)
Ramadheer Singh

0

Nhiều lỗi, mất một thời gian để sửa chữa.

Dưới đây là các bước đơn giản:

# Tải xuống tệp ZIP Googletest từ: https://github.com/google/googletest

# Giải pháp studio trực quan của Googletest

Open    C:\googletest\googletest\msvc\2010\gtest.sln
    Change "Solution configuration"
        from "Debug" to "Release"
    Build Solution
        creates gtest.lib

# Dự án của bạn:

Project Properties > Configuration Properties > VC++ Directories > Include Directories
    append the following:       ;C:\googletest\googletest\include

Project Properties > Configuration Properties > Linker > General > Additional Library Directories > 
    append the following:           ;C:\googletest\googletest\msvc\2010\gtest\Win32-Release

Project Properties > Configuration Properties > C/C++ > Runtime Library
    Remove the value of the above. (or match it to Googletest project)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.