linux gcc/g++ 编译v4l-test出现错误:collect2: error: ld returned 1 exit status。

最近在安装v4l-test-0.19时遇到了问题:

linux gcc/g++ 编译v4l-test出现错误:collect2: error: ld returned 1 exit status。

此问题困扰了我很久,我尝试了许多方法:

1,在使用gcc编译的时候是:gcc xxx -pthread,及可以在后面添加-pthread,具体可参考一下网址

https://blog.****.net/dangzhangjing97/article/details/80169103

尝试之后没有效果,哭%>_<%~

2,将lcunit放在最后,及cc -lcunit -o *.o v4l-test 改为 cc -lcunit -o *.o v4l-test -lcunit。结果成功了,开心~,参考网址:

https://sourceforge.net/p/cunit/discussion/103746/thread/8b6a20c2/

kungfoo @ artur〜/ tmp $ cc -lcunit -o cunit_example cunit_example.c
/tmp/cc2LVLaR.o:在函数testFPRINTF': cunit_example.c:(.text+0xd6): undefined reference toCU_assertImplementation'中
cunit_example.c :(。text + 0x124):未定义对'CU_assertImplementation'的引用
...
kungfoo @ artur 〜/ tmp $ cc -lcunit -o cunit_example cunit_example.c -lcunit
kungfoo @ artur〜/ tmp $

在某些情况下,必须在源/对象列表之前使用-l ...,并且在大多数情况下,在列表/列表之后是​​必需的。如果同时使用这两种方法似乎都可行,所以我采用一种策略,在以后的Makefile中将-l ...放在源/对象列表的前面和后面。

我确实没有这种情况的任何逻辑原因,但事实确实如此。显然,ld对库的处理方式有所不同,将库放在link命令的末尾是标准做法。

我不确定导致问题的确切代码路径是什么,但是当我开始看到未定义的引用时,我首先使用了字符串,并在/usr/lib/libcunit.a中找到了函数名称,然后我使用了nm,并且看到该库包含未定义的符号。链接对我来说仍然是一个神奇的黑匣子,因此我无法真正解释所有这些事情。如果有人能在这种情况下发挥一些专业知识,我将不胜感激。