【问题标题】:Compile a project with C and C++ files separately using gcc and g++?使用 gcc 和 g++ 分别编译带有 C 和 C++ 文件的项目?
【发布时间】:2015-05-20 14:38:44
【问题描述】:

我有一个包含 C 和 C++ 文件的项目,我创建了一个 Makefile 来编译这个项目。

是否有可能有一个 Makefile 将“分离”C 和 C++ 文件,C 文件将使用 gcc 编译,C++ 文件使用 g++ 并创建一个二进制文件?

这是我创建的 Makefile:

TECHAUDIO_ROOT = ../../../../../../..
TECHAUDIO_GENERIC = $(TECHAUDIO_ROOT)/Generic
TECHAUDIO_MALLOC_3DSL = $(TECHAUDIO_ROOT)/Tools/Malloc_3DSL
TECHAUDIO_SIGPROC_COMMON_SRC = ../../../../SignalProcessing/RefFT/Common/src
TECHAUDIO_SIGPROC_SRC = ../../../../SignalProcessing/RefFT/Float/src
TECHAUDIO_LIMOTOR_SRC = ../../../RefFT/Float/src
TECHAUDIO_LIMOTOR_COMMON_SRC = ../../../RefFT/Common/src/API

INCLUDES += -I$(TECHAUDIO_GENERIC)/Common/Include \
            -I$(TECHAUDIO_GENERIC)/X86/Include \
            -I$(TECHAUDIO_MALLOC_3DSL)/RefFT/Common/Include \
            -I$(TECHAUDIO_SIGPROC_COMMON_SRC) \
            -I$(TECHAUDIO_SIGPROC_SRC)/Math \
            -I$(TECHAUDIO_SIGPROC_SRC)/Transform \
            -I$(TECHAUDIO_SIGPROC_SRC)/Filter \
            -I$(TECHAUDIO_SIGPROC_SRC)/Vector \
            -I$(TECHAUDIO_SIGPROC_SRC)/SSTP \
            -I$(TECHAUDIO_LIMOTOR_SRC)/API \
            -I$(TECHAUDIO_LIMOTOR_COMMON_SRC) \
            -I$(TECHAUDIO_LIMOTOR_SRC)

SRCS =      $(TECHAUDIO_LIMOTOR_SRC)/LIMITOR_main_32f.c \
            $(TECHAUDIO_LIMOTOR_SRC)/API/LIMITOR_API_32f.c \
            $(TECHAUDIO_LIMOTOR_SRC)/API/LIMITOR_API_coordinate_32f.c

SRCSCPP =   $(TECHAUDIO_LIMOTOR_SRC)/Test/LIMITOR_TEST_example_32f.cpp
#           $(TECHAUDIO_LIMOTOR_SRC)/VST/LIMITOR_VST_audioEffect_32f.cpp \                                                                                                      
#           $(TECHAUDIO_LIMOTOR_SRC)/VST/LIMITOR_VST_main_32f.cpp                                                                                                               

NAME = Bonjour

CC = gcc

CPP = g++

CFLAGS += $(INCLUDES)
CFLAGS += -D_X86_GCC_4_1_1_TARGET_
#CFLAGS +=-D_X86_VC8_TARGET_                                                                                                                                                        
RM = rm -f

OBJ= $(SRCS:.c=.o)

OBJCPP= $(SRCSCPP:.cpp=.o)

all: $(NAME)

$(NAME): $(OBJ)
        $(CC) $(CFLAGS) $(OBJ) -o $(NAME) -lm
         $(OBJCPP)
        $(CPP) $(CFLAGS) $(OBJCPP) -o $(NAME) -lm

clean:
        $(RM) $(OBJ) $(OBJCPP)

fclean: clean
        $(RM) $(NAME)
re: fclean all

编辑

以下是 Makefile 的更新版本:

TECHAUDIO_ROOT = ../../../../../../..
TECHAUDIO_GENERIC = $(TECHAUDIO_ROOT)/Generic
TECHAUDIO_MALLOC_3DSL = $(TECHAUDIO_ROOT)/Tools/Malloc_3DSL
TECHAUDIO_SIGPROC_COMMON_SRC = ../../../../SignalProcessing/RefFT/Common/src
TECHAUDIO_SIGPROC_SRC = ../../../../SignalProcessing/RefFT/Float/src
TECHAUDIO_LIMOTOR_SRC = ../../../RefFT/Float/src
TECHAUDIO_LIMOTOR_COMMON_SRC = ../../../RefFT/Common/src/API

INCLUDES += -I$(TECHAUDIO_GENERIC)/Common/Include \
            -I$(TECHAUDIO_GENERIC)/X86/Include \
            -I$(TECHAUDIO_MALLOC_3DSL)/RefFT/Common/Include \
            -I$(TECHAUDIO_SIGPROC_COMMON_SRC) \
            -I$(TECHAUDIO_SIGPROC_SRC)/Math \
            -I$(TECHAUDIO_SIGPROC_SRC)/Transform \
            -I$(TECHAUDIO_SIGPROC_SRC)/Filter \
            -I$(TECHAUDIO_SIGPROC_SRC)/Vector \
            -I$(TECHAUDIO_SIGPROC_SRC)/SSTP \
            -I$(TECHAUDIO_LIMOTOR_SRC)/API \
            -I$(TECHAUDIO_LIMOTOR_COMMON_SRC) \
            -I$(TECHAUDIO_LIMOTOR_SRC)

 SRCS =     $(TECHAUDIO_LIMOTOR_SRC)/LIMITOR_main_32f.c \
            $(TECHAUDIO_LIMOTOR_SRC)/API/LIMITOR_API_32f.c \
            $(TECHAUDIO_LIMOTOR_SRC)/API/LIMITOR_API_coordinate_32f.c

SRCSCPP =   $(TECHAUDIO_LIMOTOR_SRC)/Test/LIMITOR_TEST_example_32f.cpp
#           $(TECHAUDIO_LIMOTOR_SRC)/VST/LIMITOR_VST_audioEffect_32f.cpp \                                                                                                      
#           $(TECHAUDIO_LIMOTOR_SRC)/VST/LIMITOR_VST_main_32f.cpp                                                                                                               

NAME = Bonjour

CC = gcc

CPP = g++

CFLAGS += $(INCLUDES)
CFLAGS += -D_X86_GCC_4_1_1_TARGET_
#CFLAGS +=-D_X86_VC8_TARGET_                                                                                                                                                        

RM = rm -f

OBJ= $(SRCS:.c=.o)

OBJCPP= $(SRCSCPP:.cpp=.o)

%.o: %.c
        $(CC) $(CFLAGS) $<

%.o: %.cpp
        $(CPP) $(CFLAGS) $<

all: $(NAME)

$(NAME): $(OBJ) $(OBJCPP)
           $(LD)  $^ -o $@ $(LDFLAGS)

clean:
         $(RM) $(OBJ) $(OBJCPP)

fclean: clean
        $(RM) $(NAME)
re: fclean all

这些是我在执行make 时收到的错误:

/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 20 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 21 a un index de symbole 22 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_line): réadressage 0 a un index de symbole 2 invalide
/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o: dans la fonction « _start »:
(.text+0x18): référence indéfinie vers « main »
/tmp/ccvLa3z6.o: dans la fonction « LIMITOR_3DSL_getStatusSize_32f »:
LIMITOR_main_32f.c:(.text+0x1e): référence indéfinie vers « MALLOC_3DSL_compute_memory_size_align_heap »

【问题讨论】:

    标签: c++ c gcc makefile g++


    【解决方案1】:

    尝试添加这些规则:

    %.o: %.c
         $(CC) $(CFLAGS) $<
    
    %.o: %.cpp
         $(CPP) $(CFLAGS) $<
    

    并将您的主线更改为:

    $(NAME): $(OBJ) $(OBJCPP)
         $(LD)  $^ -o $@ $(LDFLAGS)
    

    编辑:

    这是一种将其集成到您的代码中的尝试。不过,我没有运行它。

    TECHAUDIO_ROOT = ../../../../../../..
    TECHAUDIO_GENERIC = $(TECHAUDIO_ROOT)/Generic
    TECHAUDIO_MALLOC_3DSL = $(TECHAUDIO_ROOT)/Tools/Malloc_3DSL
    TECHAUDIO_SIGPROC_COMMON_SRC = ../../../../SignalProcessing/RefFT/Common/src
    TECHAUDIO_SIGPROC_SRC = ../../../../SignalProcessing/RefFT/Float/src
    TECHAUDIO_LIMOTOR_SRC = ../../../RefFT/Float/src
    TECHAUDIO_LIMOTOR_COMMON_SRC = ../../../RefFT/Common/src/API
    
    INCLUDES += -I$(TECHAUDIO_GENERIC)/Common/Include \
                -I$(TECHAUDIO_GENERIC)/X86/Include \
                -I$(TECHAUDIO_MALLOC_3DSL)/RefFT/Common/Include \
                -I$(TECHAUDIO_SIGPROC_COMMON_SRC) \
                -I$(TECHAUDIO_SIGPROC_SRC)/Math \
                -I$(TECHAUDIO_SIGPROC_SRC)/Transform \
                -I$(TECHAUDIO_SIGPROC_SRC)/Filter \
                -I$(TECHAUDIO_SIGPROC_SRC)/Vector \
                -I$(TECHAUDIO_SIGPROC_SRC)/SSTP \
                -I$(TECHAUDIO_LIMOTOR_SRC)/API \
                -I$(TECHAUDIO_LIMOTOR_COMMON_SRC) \
                -I$(TECHAUDIO_LIMOTOR_SRC)
    
     SRCS =     $(TECHAUDIO_LIMOTOR_SRC)/LIMITOR_main_32f.c \
                $(TECHAUDIO_LIMOTOR_SRC)/API/LIMITOR_API_32f.c \
                $(TECHAUDIO_LIMOTOR_SRC)/API/LIMITOR_API_coordinate_32f.c
    
    SRCSCPP =   $(TECHAUDIO_LIMOTOR_SRC)/Test/LIMITOR_TEST_example_32f.cpp
    #           $(TECHAUDIO_LIMOTOR_SRC)/VST/LIMITOR_VST_audioEffect_32f.cpp \                                                                                                      
    #           $(TECHAUDIO_LIMOTOR_SRC)/VST/LIMITOR_VST_main_32f.cpp                                                                                                               
    
    NAME = Bonjour
    
    CC = gcc -c
    CPP = g++ -c
    LD = g++ -o
    
    CFLAGS += $(INCLUDES)
    CFLAGS += -D_X86_GCC_4_1_1_TARGET_
    #CFLAGS +=-D_X86_VC8_TARGET_                                                                                                                                                        
    
    RM = rm -f
    
    OBJ= $(SRCS:.c=.o)
    
    OBJCPP= $(SRCSCPP:.cpp=.o)
    
    %.o: %.c
        $(CC) $< -o $@ $(CFLAGS)
    
    %.o: %.cpp
        $(CPP) $< -o $@  $(CFLAGS)
    
    all: $(NAME)
    
    $(NAME): $(OBJ) $(OBJCPP)
        $(LD) $@  $^ -lm
    
    clean:
             $(RM) $(OBJ) $(OBJCPP)
    
    fclean: clean
        $(RM) $(NAME)
    
    re: fclean all
    

    【讨论】:

    • 我做到了,当我编译时,我没有对“main”的引用。主要在c++文件LIMITOR_TEST_example_32f.cpp
    • 它编译了所有文件吗?你看到所有的 .o 文件了吗?因为你没有定义LD,所以我在那里写的显然不可用,但原则应该是正确的。加完之后能给个完整的代码吗?
    • 不,它停在第一个文件上。但我更新 qustion 并显示日志可能是出于不同的原因
    • @leykan LD 是链接器程序的通用名称,在本例中也是 GCC。我添加了一个可以工作但没有运行的完整源代码。
    • 谢谢它的工作原理!唯一的问题是我不明白这个 Makefile 我要去研究一下语法 thx
    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 2021-08-19
    • 1970-01-01
    • 2015-05-03
    相关资源
    最近更新 更多