C 在深度嵌套的源/生成文件中正确地包含(POSIX)库
长话短说:我们有一个大型SDK,其中包含约1Gb的毛茸茸的代码,这些代码是由厄尔巴尼安代码奴隶(Elbonian code Slaves)拼凑而成的,duck由一个抖动的RPC晶格、共享内存、互斥/信号量和spit组成。它是在Linux机器上为嵌入式SoC目标编译的 作为改进代码部分的尝试的一部分,我想将POSIX信号量添加到一个源代码中,其中包括一些RPC例程 但是,只需编写一些有效的代码&粘贴C 在深度嵌套的源/生成文件中正确地包含(POSIX)库,c,linux,gcc,makefile,include,C,Linux,Gcc,Makefile,Include,长话短说:我们有一个大型SDK,其中包含约1Gb的毛茸茸的代码,这些代码是由厄尔巴尼安代码奴隶(Elbonian code Slaves)拼凑而成的,duck由一个抖动的RPC晶格、共享内存、互斥/信号量和spit组成。它是在Linux机器上为嵌入式SoC目标编译的 作为改进代码部分的尝试的一部分,我想将POSIX信号量添加到一个源代码中,其中包括一些RPC例程 但是,只需编写一些有效的代码&粘贴 #include <semaphore.h> 我没有编写Makefile的丰富经验,
#include <semaphore.h>
我没有编写Makefile的丰富经验,不幸的是,由于代码库的大小,它们有多个嵌套级别(SDK中超过2000个Makefile),具有各种依赖关系,所有这些都是从根文件夹中的一个真正的Makefile派生的
makefiles中有很多宏化(TM),这无助于我解开正确的咒语
从我试图修改的项目和文件的结构来看,文件夹结构类似于:
/home/project/kernel/... Contains the Linux kernel & PSP / BSP
/home/project/the_system/... Contains the software suite we're building
我们正在查看的文件位于:
/home/project/the_system/core_app/interface/src/messaging.c
它本身可能包含在5个其他来源中,例如:
/home/project/the_system/core_app/interface/src/sys-control.c
/home/project/the_system/core_app/interface/src/file-control.c
/home/project/the_system/core_app/interface/src/audio-control.c
。。。你明白了。然后,这些过程中的每一个都可能被其他希望相互通信的过程包含/调用。我有没有提到过这一切都很可怕
链上几乎每个文件夹中都有makefile,本地文件夹中的makefile
/home/project/the_system/core_app/interface/src/Makefile
是这样的(为了清晰起见,我删除了一些位,忽略未引用的对象):
我需要做什么才能正确编译此文件?
作为一个额外问题,有没有办法确定以下哪一项:
-pthread
-lpthread
-lpthreads
-lrt
-rt
是否适合我们特定的构建环境
编辑以添加(也包括TL;DR): 我似乎遇到了与本文中提到的情景完全相同的情况 然而,无论我把-lpthread和-lrt参数放在哪里,我都会得到错误 例如,我尝试添加对pthread_mutex_trylock的调用,但未能编译:
undefined reference to 'pthread_mutex_trylock'
…即使调用pthread\u mutex\u lock的现有函数编译正常。我不确定第一个问题的确切含义。我将尝试涵盖所有可能性 第二个问题的答案几乎被约阿希姆所涵盖 如果更改
messaging.c
,例如,如果在顶部添加头文件,系统将尝试生成messaging.o
如果您想知道如何成功尝试,那么,您需要在INCLUDES
变量中提供文件semaphore.h
的正确位置。它是一个“系统”文件,位于其中一个“系统”包含目录中
如果您想确保在semaphore.h
更改时重建messaging.o
,您需要阅读GNU Make手册或MadScientist网站上关于高级自动依赖生成的部分
或者,使用埃里克梅尔斯基一直在谈论的电子加速器。这是一款神奇的软件,内置了自动生成依赖项的免费软件。你什么都不用做
另外,正如您已经知道的,您正在显示的Makefile编写得非常糟糕,非常“naive”。听起来你有一个由几千个类似糟糕的makefile组成的递归系统。是的,太可怕了
听起来你个人并不想修复这个构建系统,你只想给软件本身添加一些功能
所以,我认为你需要聘请一位专家顾问,为你的公司编写一个最先进的系统,也许使用电子加速器,或者简单的老式GNU制造。你明白了吗?嗯,如果埃里克能一直在这里插上插头,他能逃脱惩罚,那么我也能:)好吧,我终于得到了这个可恨的东西,不幸的是,更多的是由于暴力和无知,而不是一些优雅的编码天才大师的杰作 然而,如果它能帮助下一代,我遵循的路线是:
- 在我的示例makefile中将
添加到-lrt-lpthread
,然后尝试C_标志
make
- 当
失败时,查看失败的位置,从该位置加载makefile,并以类似方式在该makefile中添加make
-lrt-lpthread
- 起泡、冲洗、重复,直到
成功make
护士,屏幕 “它本身也包括在内……”等等,什么?正在包含.c文件?
-pthread
标志通常意味着链接到pthread
库。据我所知,没有-rt
标志,但是有一个rt
库可以链接到。如果需要链接rt
库(或pthread
库),则应在手册页面中提供所用函数。如果您不确定某个函数以及需要链接的库(或要包含的头文件),请始终查阅函数手册页。@IgnacioVazquez Abrams-否,../inc/messaging.h包含在内,毫无疑问,messaging.o/.a也会在相关的makefile中提及。我只是想用宽泛的笔触,而不是全部的细节。显然,第一段是+1。现在我来看看实际的问题:)如果我可以升级两次,我会为您描述的构建系统添加另一个:)我个人很想修复整个系统,但是,一个人对包含数百万行代码的SDK进行彻底的重写并不是客户付钱让我花10年时间来做的事情。不,我只是说重写构建系统,生成文件。不,不会是10年。所有构建项目都需要1/2年或更短的时间,regardl
#include <semaphore.h>
/home/project/the_system/core_app/interface/src/messaging.c
-pthread
-lpthread
-lpthreads
-lrt
-rt
undefined reference to 'pthread_mutex_trylock'