Joh*_*n U 5 c linux gcc makefile include
简而言之:我们有一个大型SDK,其中包含由Elbonian Code Slaves共同攻击的~1Gb多毛的代码,由一个颤抖的RPC格式,共享内存,互斥/信号量和吐痰捆绑在一起.它是在Linux机器上编译的,用于嵌入式SoC目标.
作为改进部分代码的一部分,我想将POSIX信号量添加到其中一个源中,这些源包含在一些RPC例程中.
但是,只需编写一些有效的代码并坚持下去
#include <semaphore.h>
Run Code Online (Sandbox Code Playgroud)
在顶部当然不足以启用编译.
所需要的是makefile中的特殊标志,具体取决于您所读取的内容可能是以下任何/全部:
-pthread
-lpthread
-lpthreads
-lrt
-rt
Run Code Online (Sandbox Code Playgroud)
我没有很多编写makefile的经验,不幸的是由于代码库的大小,它们有多个嵌套级别(SDK中超过2,000个makefile),具有各种依赖关系,所有这些都来自One True Makefile在根文件夹中.
makefile中有很多macroification(TM)正在进行,这无助于我解开正确的咒语.
作为项目结构和我试图修改的文件的一瞥,文件夹结构类似于:
/home/project/kernel/... Contains the Linux kernel & PSP / BSP
/home/project/the_system/... Contains the software suite we're building
Run Code Online (Sandbox Code Playgroud)
我们正在查看的文件位于:
/home/project/the_system/core_app/interface/src/messaging.c
Run Code Online (Sandbox Code Playgroud)
其中包括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
Run Code Online (Sandbox Code Playgroud)
......你明白了.这些中的每一个都可能被其他希望彼此通信的进程包含/调用我是否提到这一切都很可怕?
该链中的每个文件夹中都有makefile,本地文件夹中的makefile
/home/project/the_system/core_app/interface/src/Makefile
Run Code Online (Sandbox Code Playgroud)
是这样的(为清楚起见,我删除了一些位,忽略了未引用的对象):
INCLUDES += -I./ -I$(PUBLIC_INCLUDE_DIR) -I$(LINUXKERNEL_INSTALL_DIR)/include -I$(CMEM_INSTALL_DIR)/packages/ti/sdo/linuxutils/cmem/include -lpthreads
C_FLAGS += -Wall -g -O3
AR_FLAGS += -r
CC = $(MVTOOL_PREFIX)gcc $(INCLUDES) $(C_FLAGS) -c
AR = $(MVTOOL_PREFIX)ar
REL_EXE1 = reboot_me
REL_LIB1 = file-control.a
REL_LIB3 = share_mem.a
REL_LIB4 = sys-control.a
REL_LIB5 = msg_util.a
REL_LIB9 = messaging.a
REL_LIB10 = sysctrl.a
REL_LIB11 = audio-control.a
REL_OBJ1 = file-control.o share_mem.o msg_util.o
REL_OBJ3 = share_mem.o
REL_OBJ4 = sys-control.o share_mem.o msg_util.o
REL_OBJ5 = msg_util.o
REL_OBJ9 = messaging.o
REL_OBJ10 = sysctrl.o sys-control.o share_mem.o msg_util.o messaging.o audio-control.o
REL_OBJ11 = audio-control.o messaging.o share_mem.o msg_util.o
all: $(REL_EXE1) $(REL_LIB9) $(REL_LIB12) $(REL_LIB3) $(REL_LIB1) $(REL_LIB2) $(REL_LIB4) $(REL_LIB5) $(REL_LIB6) $(REL_LIB7) $(REL_LIB8) $(REL_LIB10) $(REL_LIB11) install
$(REL_LIB1): $(REL_OBJ1)
$(AR) $(AR_FLAGS) $(REL_LIB1) $(REL_OBJ1)
$(REL_LIB2): $(REL_OBJ2)
$(AR) $(AR_FLAGS) $(REL_LIB2) $(REL_OBJ2)
$(REL_LIB3): $(REL_OBJ3)
$(AR) $(AR_FLAGS) $(REL_LIB3) $(REL_OBJ3)
$(REL_LIB4): $(REL_OBJ4)
$(AR) $(AR_FLAGS) $(REL_LIB4) $(REL_OBJ4)
$(REL_LIB5): $(REL_OBJ5)
$(AR) $(AR_FLAGS) $(REL_LIB5) $(REL_OBJ5)
$(REL_LIB7): $(REL_OBJ7)
$(AR) $(AR_FLAGS) $(REL_LIB7) $(REL_OBJ7)
$(REL_LIB8): $(REL_OBJ8)
$(AR) $(AR_FLAGS) $(REL_LIB8) $(REL_OBJ8)
$(REL_LIB9): $(REL_OBJ9)
$(AR) $(AR_FLAGS) $(REL_LIB9) $(REL_OBJ9)
$(REL_LIB10): $(REL_OBJ10)
$(AR) $(AR_FLAGS) $(REL_LIB10) $(REL_OBJ10)
$(REL_LIB11): $(REL_OBJ11)
$(AR) $(AR_FLAGS) $(REL_LIB11) $(REL_OBJ11)
$(REL_LIB12): $(REL_OBJ12)
$(AR) $(AR_FLAGS) $(REL_LIB12) $(REL_OBJ12)
file-control.o : file-control.c $(PUBLIC_INCLUDE_DIR)/file-control.h $(PUBLIC_INCLUDE_DIR)/Msg_Def.h\
$(PUBLIC_INCLUDE_DIR)/sys_env_type.h
$(CC) $(C_FLAGS) -o $@ $<
audio-control.o : audio-control.c $(PUBLIC_INCLUDE_DIR)/audio-control.h \
$(PUBLIC_INCLUDE_DIR)/Msg_Def.h $(PUBLIC_INCLUDE_DIR)/sys_env_type.h
$(CC) $(C_FLAGS) -o $@ $<
share_mem.o: share_mem.c $(PUBLIC_INCLUDE_DIR)/share_mem.h
$(CC) $(C_FLAGS) -o $@ $<
sys-control.o : sys-control.c $(PUBLIC_INCLUDE_DIR)/sys-control.h $(PUBLIC_INCLUDE_DIR)/Msg_Def.h\
$(PUBLIC_INCLUDE_DIR)/sys_env_type.h $(PUBLIC_INCLUDE_DIR)/share_mem.h
$(CC) $(C_FLAGS) -o $@ $<
msg_util.o: msg_util.c $(PUBLIC_INCLUDE_DIR)/Msg_Def.h
$(CC) $(C_FLAGS) -o $@ $<
messaging.o: messaging.c $(PUBLIC_INCLUDE_DIR)/messaging.h
$(CC) $(C_FLAGS) -o $@ $<
sysctrl.o: sysctrl.c $(PUBLIC_INCLUDE_DIR)/sysctrl.h $(PUBLIC_INCLUDE_DIR)/sys_env_type.h
$(CC) $(C_FLAGS) -o $@ $<
reboot_me:
$(MVTOOL_PREFIX)gcc -g -Wall -static -c -o reboot_me.o reboot_me.c
$(MVTOOL_PREFIX)gcc -o reboot_me reboot_me.o
clean:
-$(RM) -f *.o
-$(RM) -f *.a
-$(RM) -f $(REL_EXE1)
-$(RM) -Rf $(APP_LIB_DIR)
install: $(REL_EXE1) $(REL_LIB3) $(REL_LIB1) $(REL_LIB2) $(REL_LIB4) $(REL_LIB5) $(REL_LIB7)
install -d $(APP_LIB_DIR)
install $(REL_LIB1) $(APP_LIB_DIR)
install $(REL_LIB2) $(APP_LIB_DIR)
install $(REL_LIB3) $(APP_LIB_DIR)
install $(REL_LIB4) $(APP_LIB_DIR)
install $(REL_LIB5) $(APP_LIB_DIR)
install $(REL_LIB7) $(APP_LIB_DIR)
install $(REL_LIB8) $(APP_LIB_DIR)
install $(REL_LIB9) $(APP_LIB_DIR)
install $(REL_LIB10) $(APP_LIB_DIR)
install $(REL_LIB11) $(APP_LIB_DIR)
install $(REL_LIB12) $(APP_LIB_DIR)
install $(REL_EXE1) $(EXEC_DIR)
Run Code Online (Sandbox Code Playgroud)
无论如何,已添加
#include <semaphore.h>
Run Code Online (Sandbox Code Playgroud)
到顶部
/home/project/the_system/core_app/interface/src/messaging.c
Run Code Online (Sandbox Code Playgroud)
我需要做什么才能让它正确编译?
作为一个奖金问题,有没有办法确定哪一个:
-pthread
-lpthread
-lpthreads
-lrt
-rt
Run Code Online (Sandbox Code Playgroud)
对于我们特定的构建环境,它是正确的吗?
编辑添加(也是TL; DR):
我似乎遇到了这个问题中提到的场景的完全重复.
但是,无论我在哪里粘贴-lpthread和-lrt参数,都会出错.
例如,我尝试添加对pthread_mutex_trylock的调用,但无法编译:
undefined reference to 'pthread_mutex_trylock'
Run Code Online (Sandbox Code Playgroud)
...即使调用pthread_mutex_lock的现有函数编译正常.
好吧,我终于得到了可恨的东西来构建,不幸的是更多的是通过蛮力和无知而不是一些优雅的编码天才的杰作。
然而,如果它对后代有所帮助,我遵循的路线是:
-lrt -lpthread
到C_FLAGS
我的示例 makefile 中,然后尝试make
make
,查看失败的位置,从该位置加载 makefile 并以-lrt -lpthread
类似的方式添加到该 makefile 中。make
成功。它现在看起来工作正常,当然现在还有 100 个其他错误需要修复,但至少我最终让它编译了。
护士,屏幕!
归档时间: |
|
查看次数: |
402 次 |
最近记录: |