Линкер не находит символ __times, который определён в libc
Не думал, что буду здесь когда-либо спрашивать про undefined reference, ибо джуниором себя уже не считаю, но тем не менее придётся. Убедительно прошу не ставить дубликат на известный здесь вопрос, я пытался разобраться и привёл здесь максимум информации.
Начнём с того, что у меня специфическая аппаратная платформа: NMC4. SDK скачан с сайта разработчика и установлен без проблем. При компиляции возникает ошибка линкера:
nmc-g++ main.o -mnmc4 -fexceptions "D:\lab\NMC\nmpp\lib\libnmpp-nmc4d.a" "D:\lab\NMC\hal\lib\libhal-mc12101.a" -o FixPoint /cygdrive/c/Program Files/Module/NMC-SDK/nmc4-ide/lib/gcc/nmc/4.8.3/../../../../nmc/lib/nmc4/libc.a(lib_a-timesr.o): In function `__times_r': (.text.__times_r+0xd): undefined reference to `__times'
Символ __times определён в библиотеке libc.a. Вывод nm:
U __times_r
lib_a-systimes.o:
U __times_r
00000000 T _times
lib_a-timesr.o:
U __times
00000000 T __times_r
Библиотека libc.a подключается автоматически тулчейном, но при принудительном подключении её в настройках компилятора ситуация не меняется. Надо полагать, что эту библиотеку линкер видит: ведь на остальные символы из этой библиотеки он не ругается.
Библиотека libc.a существует только в релизной версии. Попытка смены конфигурации проекта с Debug на Release результатов не дала.
Попытка определения символа __times в своём коде
int __times;
также результата не дала. Я же правильно понимаю, что без модификаторов доступа символы, объявленные в c-файлах имеют публичное связывание?
Техподдержка пока молчит.
/*
* main.cpp
*
* Created on: 9 . 2021 .
* Author: Alouette
*/
#include "nmpp.h"
#include <iostream>
#define SIZE 64
//Вот эта строка, предложенная Fat-Zer, решает проблему, но использовать её - не лучшая идея
//extern "C" int _times(struct tms *buf) { return -1; }
int main()
{
//Если закомментировать выделение памяти, то программа компилируется.
//Но запускать тогда нет смысла.
//Видимо, вызов __times спрятался где-то в недрах функции nmppsMalloc_8s.
nm8s *vec1 = (nm8s*)nmppsMalloc_8s(SIZE);
nm8s *vec2 = (nm8s*)nmppsMalloc_8s(SIZE);
nm8s *result = (nm8s*)nmppsMalloc_8s(SIZE);
nmppsRandUniform_8s(vec1, SIZE);
nmppsRandUniform_8s(vec2, SIZE);
nmppsAdd_8s(vec1, vec2, result, SIZE);
for (int i = 0; i < SIZE; i++)
{
std::cout << nmppsGet_8s(vec1, i) << "+" << nmppsGet_8s(vec2, i) << "=" << nmppsGet_8s(result, i) << std::endl;
}
std::cout.flush();
nmppsFree(vec1);
nmppsFree(vec2);
nmppsFree(result);
return 0;
}
Ответы (1 шт):
Как ответили представители компании производителя, то, что вызов malloc тянет за собой _times, действительно ошибка. Для исправления создан коммит. Нужно обновить библиотеку NMPP и пересобрать её.