First step is always the same: go to Google code and download the Google Test zipped archive.
Do you already have cmake at hand? The Google Test package provides a few specific building files for some environments, the other ones are generated on the fly by this tool. Have a look at the official CMake site for more information. Here we'll be happy enough getting cmake from the standard repository:
sudo apt-get install cmakeOnce you have unzipped the GTest package, you should see in its base directory a file named CMakeLists.txt, we'll pass it to cmake to generate a proper Makefile tailored on the current system characteristics.
cmake CMakeLists.txtDo you see a newly generated Makefile? Good, make it up. As result you should get (among the other stuff) a couple of static libraries: libgtest.a and libgtest_main.a
I symlink-ed them in /usr/local/lib, then I symlink-ed the include/gtest directory to /usr/local/include. Now I am ready to write a tiny test application.
Here is the Makefile that I am going to use:
MY_NAME := gt
MY_SRCS := $(wildcard *.cpp)
MY_OBJS := ${MY_SRCS:.cpp=.o}
MY_INCLUDE_DIRS := /usr/local/include
MY_LIBRARY_DIRS := /usr/local/lib
MY_LIBRARIES := gtest
CXXFLAGS += $(foreach includedir,$(MY_INCLUDE_DIRS),-I$(includedir))
CXXFLAGS += -Wall -g -pthread
LDFLAGS += $(foreach librarydir,$(MY_LIBRARY_DIRS),-L$(librarydir))
LDLIBS += $(foreach library,$(MY_LIBRARIES),-l$(library))
.PHONY: all clean
all: $(MY_NAME)
$(MY_NAME): $(MY_OBJS)
$(LINK.cc) -o $(MY_NAME) $(MY_OBJS) $(LDLIBS)
clean:
@- rm -rf $(MY_OBJS) $(MY_NAME)
Notice that among the C++ flags it has been specified -pthread, since GTest requires the POSIX thread library. If you forget to specify it, you would get a bunch of undefined reference to pthreads symbols.I reused the source code as defined in my old post about GTest on Windows that, as expected, works smoothly in this new context. The only (really minor) change that I applied is in the main function. Here I want to always run the tests and then give the control to the normal application execution path:
int main(int argc, char* argv[])
{
Tester(argc, argv).run();
std::cout << "Normal program behavior" << std::endl;
}
If you run it, you would get the output from GTest, where a test (TestIncrease.NormalBehavior) succeedes and another one (TestIncrease.ErrorTest) fails.Alternatively, you could remove the C++ main function source from the build, and use instead the standard bootstrap functionality that GTest makes available. To do that, just add gtest_main among the libraries in the MY_LIBRARIES list.
Gary (thank you!) suggests me to stress a couple of points, very useful if you are new in this area:
- Indentation in Makefile is done with tabs!
- In the UNIX family of Operating Systems, the file separator is the slash ('/'), be careful not to use the backslash ('\')!
No comments:
Post a Comment