Неопределенная ссылка на 'getcwd' и 'mkdir' при создании тестового проекта Google - PullRequest
0 голосов
/ 11 марта 2020

, даже если я строго следовал инструкциям из этого поста , я не могу заставить мою тестовую демонстрационную программу Google скомпилироваться. Я использую Eclipse на Windows 10 x64 и встроенный набор инструментов ARM G CC для компиляции моего кода, так как в конечном итоге мне потребуется запустить модульные тесты на встроенных устройствах. Моя проблема в том, что когда я пытаюсь построить проект, я получаю следующие ошибки:

c:/program files (x86)/gnu tools arm embedded/9 2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: ./contrib/gtest/gtest-all.o: in function `testing::internal::FilePath::GetCurrentDir()':
C:\Users\Hugo\eclipse\eclipse-workspace\test_gtest\Debug/../contrib/gtest/gtest-all.cc:9598: undefined reference to `getcwd'
c:/program files (x86)/gnu tools arm embedded/9 2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: ./contrib/gtest/gtest-all.o: in function `testing::internal::FilePath::CreateFolder() const':
C:\Users\Hugo\eclipse\eclipse-workspace\test_gtest\Debug/../contrib/gtest/gtest-all.cc:9823: undefined reference to `mkdir'
collect2.exe: error: ld returned 1 exit status
make: *** [makefile:61: test_gtest.elf] Error 1

Более точно это происходит из этих строк кода в файле gtest_all. cc:

Для неопределенная ссылка на 'getcwd'

FilePath FilePath::GetCurrentDir() {
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
    GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_ESP32
  // These platforms do not have a current directory, so we just return
  // something reasonable.
  return FilePath(kCurrentDirectoryString);
#elif GTEST_OS_WINDOWS
  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
  return FilePath(_getcwd(cwd, sizeof(cwd)) == nullptr ? "" : cwd);
#else
  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
  char* result = getcwd(cwd, sizeof(cwd));
# if GTEST_OS_NACL
  // getcwd will likely fail in NaCl due to the sandbox, so return something
  // reasonable. The user may have provided a shim implementation for getcwd,
  // however, so fallback only when failure is detected.
  return FilePath(result == nullptr ? kCurrentDirectoryString : cwd);
# endif  // GTEST_OS_NACL
  return FilePath(result == nullptr ? "" : cwd);
#endif  // GTEST_OS_WINDOWS_MOBILE
}

Для неопределенной ссылки на 'mkdir':

bool FilePath::CreateFolder() const {
#if GTEST_OS_WINDOWS_MOBILE
  FilePath removed_sep(this->RemoveTrailingPathSeparator());
  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
  int result = CreateDirectory(unicode, nullptr) ? 0 : -1;
  delete [] unicode;
#elif GTEST_OS_WINDOWS
  int result = _mkdir(pathname_.c_str());
#elif GTEST_OS_ESP8266
  // do nothing
  int result = 0;
#else
  int result = mkdir(pathname_.c_str(), 0777);
#endif  // GTEST_OS_WINDOWS_MOBILE

  if (result == -1) {
    return this->DirectoryExists();  // An error is OK if the directory exists.
  }
  return true;  // No error.
}

Я проверил, что был включен unistd.h. Я много искал, но не могу найти ни одной ошибки, похожей на мою. Самое близкое, что я мог найти, было решено людьми, использующими CMake для его компиляции, но я здесь вообще не использую CMake.

1 Ответ

0 голосов
/ 11 марта 2020

AFAIK, getcwd () и mkdir () зависят от платформы. Кажется, с другой библиотекой была похожая проблема: https://github.com/purduesigbots/pros/issues/176

Как и в приведенной выше ссылке, вы можете попытаться определить заглушку для отсутствующих символов.

В моей рабочей платформе , getcwd () и mkdir () даже удаляются из заголовка. В таком случае вы можете редактировать gtest напрямую, например:

FilePath FilePath::GetCurrentDir() {
#if GTEST_OS_CUSTOM_PLATFORM
  return kCurrentDirectoryString;
...
...