Линкер не находит символ __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 шт):

Автор решения: maestro

Как ответили представители компании производителя, то, что вызов malloc тянет за собой _times, действительно ошибка. Для исправления создан коммит. Нужно обновить библиотеку NMPP и пересобрать её.

→ Ссылка