我不认为我会在这里询问未定义的引用,因为我不再认为自己是初级,但无论如何我必须这样做。我恳请您不要在这里重复一个众所周知的问题,我试图弄清楚并在这里带来尽可能多的信息。
让我们从我有一个特定的硬件平台的事实开始: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): 在函数 `__times_r': (.text.__times_r+0xd): 未定义的对 `__times' 的引用
该符号__times
在库中定义libc.a
。纳米输出:
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;
}
malloc
正如制造商公司的代表所回答的那样,电话需要的事实_times
确实是一个错误。已创建提交来修复它。您需要更新 NMPP 库并重建它。