Estou em um ambiente de compilação cruzada em que meu projeto precisa ser compilado para Linux, Windows e um destino personalizado, que é compilado cruzado no Windows.
O projeto usa o googletest para testes de unidade e está incluído da seguinte forma, em um arquivo find do CMake, como segue:
# FindGTest.cmake
if (CMAKE_SYSTEM_NAME STREQUAL "TheTarget")
FetchContent_Declare(
GTest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.14.0)
FetchContent_MakeAvailable(GTest)
else()
find_package(GTest CONFIG REQUIRED)
endif()
As compilações do Windows e Linux não são compiladas cruzadamente e compilam bem. Mas para o alvo personalizado, recebo os seguintes erros de compilação (editados para legibilidade):
C:/dev/project/build/_deps/gtest-src/googletest/include\gtest/internal/gtest-port.h:2058:38: error: use of undeclared identifier 'isatty'
...
C:/dev/project/build/_deps/gtest-src/googletest/include\gtest/internal/gtest-port.h:2087:44: error: use of undeclared identifier 'chdir'
...
C:/dev/project/build/_deps/gtest-src/googletest/include\gtest/internal/gtest-port.h:2135:10: error: use of undeclared identifier 'getenv'; did you mean 'GetEnv'?
...
C:/dev/project/_deps/gtest-src/googletest\src/gtest-death-test.cc:1106:27: error: use of undeclared identifier 'pipe'
...
C:/dev/project/build/_deps/gtest-src/googletest\src/gtest-death-test.cc:1119:27: error: use of undeclared identifier 'fork'
...
C:/dev/project/build/_deps/gtest-src/googletest\src/gtest-death-test.cc:1204:3: error: use of undeclared identifier 'execv'
...
C:/dev/project/build/_deps/gtest-src/googletest\src/gtest-filepath.cc:115:18: error: use of undeclared identifier 'getcwd'
Como posso passar por esses erros de compilação para meu destino de compilação cruzada?
Existe uma maneira de fazer isso fornecendo a combinação certa de macros para a compilação (por exemplo, com add_definition()
instruções CMake)?
Ou devo criar uma versão personalizada do gtest? Ou seja, imagino que isso significa que não devo usar FetchContent_Declare()
/ FetchContent_MakeAvailable()
ou find_package()
incluir googletest, mas sim ter googletest como um subdiretório do meu projeto, possivelmente com alterações de código para contornar o uso das funções indefinidas(?)
Esses erros e alguns outros
pode ser resolvido desabilitando o suporte de testes de morte, aplicando patches
googletest/include/gtest/internal/gtest-port.h
e indefinindo a macroGTEST_HAS_DEATH_TEST
para seu alvo personalizado. Modifique a condiçãoPara erros de descanso, você pode implementar um POSIX mínimo como o MinGW faz.