您不能使用.c
文件在googletest而不是.cpp
文件中編寫測試類。
甲.c
文件應包含的C語言源代碼和C/C++編譯器將假定一個.c
文件 要被編譯爲C.
甲.cpp
文件應包含C++語言的源代碼和C/C++編譯器將假定.cpp
文件 將被編譯爲C++。
C和C++是相關但不同的編程語言。 C比C++更老更簡單。 C語言中沒有任何類。包含類的C++源代碼不能編譯爲C.
Googletest是一個用C++編寫的單元測試框架,而不是C,它需要你用C++編寫 你的測試代碼,使用框架類。您的測試必須編碼爲.cpp
(和.h
)文件,以便 編譯器將它們編譯爲C++。
但是,你可以使用googletest來單元測試C代碼。 C代碼將在.c
和.h
文件中,但是您的 必須像往常一樣在.cpp
和.h
文件中編碼您的單元測試。 C/C++編譯器知道 .c
文件將被編譯爲C,而.cpp
文件將被編譯爲C++。
有一個小麻煩,你必須面對,當你想#include "some_header.h"
在C++單元測試代碼,並some_header.h
是C語言頭文件之一:
C++編譯器是要處理some_header.h
,並且它可以過程它正確只要 因爲它知道some_header.h
是一個C語言的頭文件。爲了通知C++編譯器some_header.h
是C頭,你這樣寫:
extern "C" {
#include "some_header.h"
}
如果你不把extern "C" { ... }
的#include
的C語言頭左右,那麼你將得到未定義的符號 錯誤的鏈接時間。
我建議你嘗試用包含以下三個文件的項目:
return_one。^ h
// return_one.h
#ifndef RETURN_ONE_H
#define RETURN_ONE_H
// A C library :)
// A C function that always return 1.
extern int return_one(void);
#endif
return_one.c
// return_one.c
#include "return_one.h"
int return_one(void)
{
return 1;
}
test_return_one.cpp
// test_return_one.cpp
#include "gtest/gtest.h"
extern "C" {
#include "return_one.h"
}
TEST(t_return_one, returns_1)
{
EXPECT_EQ(1,return_one());
}
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
獲得這個項目進行編譯,鏈接,並與googletest運行。
你可能會發現this question有幫助的答案。
我不明白。你爲什麼在乎你的文件是否有.c或.cpp文件擴展名?爲什麼不使用工程*和*準確描述文件內容? –
我得到某些編譯問題,無法識別類型轉換 錯誤:無法將'MyVersion {aka tagMYVersion}'轉換爲'MyStatus'參數'2' 當我單獨運行ndk-build時沒有這樣的編譯問題該項目/當我編譯我的源代碼在.c文件而不是.cpp,所以想要一種方式來使用.c文件運行gtest – user3054298
因此它只適用於我的c代碼的一些部分! – user3054298