Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在深度嵌套的源/生成文件中正确地包含(POSIX)库_C_Linux_Gcc_Makefile_Include - Fatal编程技术网

C 在深度嵌套的源/生成文件中正确地包含(POSIX)库

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的丰富经验,

长话短说:我们有一个大型SDK,其中包含约1Gb的毛茸茸的代码,这些代码是由厄尔巴尼安代码奴隶(Elbonian code Slaves)拼凑而成的,duck由一个抖动的RPC晶格、共享内存、互斥/信号量和spit组成。它是在Linux机器上为嵌入式SoC目标编译的

作为改进代码部分的尝试的一部分,我想将POSIX信号量添加到一个源代码中,其中包括一些RPC例程

但是,只需编写一些有效的代码&粘贴

#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
  • make
    失败时,查看失败的位置,从该位置加载makefile,并以类似方式在该makefile中添加
    -lrt-lpthread
  • 起泡、冲洗、重复,直到
    make
    成功
它现在似乎工作正常,当然现在还有100个其他的bug需要修复,但至少我最终把它编译好了


护士,屏幕

“它本身也包括在内……”等等,什么?正在包含.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'