Setting up googletest on macOS

I am making strong assumption that you have XCode and Command Line Tools installed.

First of all, you need CMake. I prefer installation from the sources, so I go this way.

> mkdir -p $HOME/opt/src
> cd $HOME/opt/src
> curl -o https://github.com/Kitware/CMake/releases/download/v3.16.2/cmake-3.16.2.tar.gz
> tar zxf cmake-3.16.2.tar.gz
> cd cmake-3.16.2
> ./bootstrap --prefix=$HOME/opt/usr/local
> make
> make install

Make sure to have $HOME/opt/usr/local/bin on your PATH.

After you have CMake in place, you can build googletest.

> cd $HOME/opt/src
> git clone https://github.com/google/googletest.git
> cd googletest
> mkdir build
> cd build

# You have to update CMakeLists.txt in case you are working with master branch
# Add following line to CMakeLists.txt
# set(CMAKE_CXX_STANDARD 11)

# If you want to use shared libs, make sure to set -DBUILD_SHARED_LIBS=ON
# I am using static ones
> cmake -DCMAKE_INSTALL_PREFIX:PATH=$HOME/opt/usr/local -DBUILD_SHARED_LIBS=OFF ..
> make
> make install

And now, you can test the whole thing

// simple.h
int sum(int a, int b);
// simple.cc
int sum(int a, int b) {
  return a + b;
}
// simple_test.cc
#include "simple.h"
#include "gtest/gtest.h"

TEST(SumTest, Equal) {
  EXPECT_EQ(2, sum(1,1));
}

Once, everything is in place, we can run the code

> g++ -std=c++11 -o test \
  simple.cc simple_test.cc \ 
  -I. -I$HOME/opt/usr/local/include \
  $HOME/opt/usr/local/lib/libgtest.a \
  $HOME/opt/usr/local/lib/libgtest_main.a
> ./test
Running main() from $HOME/opt/src/googletest/googletest/src/gtest_main.cc
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from SumTest
[ RUN      ] SumTest.Equal
[       OK ] SumTest.Equal (0 ms)
[----------] 1 test from SumTest (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.

If you want to use libgtest.dylib and libgtest_main.dylib you will have to play a little with with @rpath.

# Make sure that google test itself has proper settings with rpath
> install_name_tool -add_rpath ${HOME}/opt/usr/local/lib \
    ${HOME}/opt/usr/local/lib/libgtest_main.dylib

> install_name_tool -change libgtest.dylib \
    @rpath/libgtest.dylib ${HOME}/opt/usr/local/lib/libgtest_main.dylib

# Compile your code
> g++ -std=c++11 -o test \
  simple.cc simple_test.cc \ 
  -I. -I$HOME/opt/usr/local/include \
  -L$HOME/opt/usr/local/lib -rpath $HOME/opt/usr/local/lib -lgtest -lgtest_main

and now, make sure to update @rpath inside your executable

> install_name_tool -change libgtest.dylib @rpath/libgtest.dylib
> install_name_tool -change libgtest_main.dylib @rpath/libgtest_main.dylib ./test

Alternative approach. Change the id of libs

> install_name_tool -id @rpath/libgtest_main.dylib $HOME/opt/usr/local/lib/libgtest_main.dylib
> install_name_tool -id @rpath/libgtest.dylib $HOME/opt/usr/local/lib/libgtest.dylib

in this case, you don’t have to rename libs inside your final executable.

And all of this started here, with this tutorial session covering googletest basics: Unit testing in CLion

References:
DT_RPATH (ld) & @rpath (dyld)
Shared Libraries: Understanding Dynamic Loading
Fun with rpath, otool, and install_name_tool
Run-Path Dependent Libraries
Overview of Dynamic Libraries