如何正确编译和链接C程序?

时间:2013-12-28 10:41:34

标签: c++ c makefile

我有一个用C编写的记录器,并将它包含在我正在处理的C ++项目中。它运行正常,但我从Clang ++得到了一个弃用的警告:“在C ++模式下将C输入视为C ++,这种行为已被弃用。”

为了废除这个警告,我将记录器的编译移动到make文件中的自己的步骤,并使用Clang编译目标文件。然后我将该对象文件的引用添加到我的Clang ++规则中以进行链接。现在它无法正确链接:“链接器命令失败,退出代码为1”

我的makefile如下。我如何正确地编译和链接这个C记录器,以便在Clang ++中取消该警告?

CC= clang++
PROG= ./bin/tetris
OBJS= ./src/main.o ./src/Tetris.o ./src/states/BaseState.o ./src/states/MenuState.o \
    ./src/states/GameState.o ./src/entities/Block.o ./src/entities/Tetromino.o \
    ./src/entities/Grid.o
LIBS= allegro-5.0 allegro_dialog-5.0 allegro_font-5.0 allegro_ttf-5.0 allegro_color-5.0 \
    allegro_primitives-5.0 allegro_main-5.0 allegro_image-5.0 allegro_audio-5.0 allegro_memfile-5.0
CXXFLAGS= -g -Wall -std=c++11 $(shell pkg-config --cflags ${LIBS})
LDFLAGS= $(shell pkg-config --static --libs ${LIBS})

all: logger $(PROG)

$(PROG): $(OBJS)
    mkdir -p ./bin
    $(CC) -v -o $(PROG) $(LDFLAGS) $(OBJS) ./src/util/SimpleLogger/simplog.o
    rm -f $(OBJS)

logger:
    clang -c -Wall ./src/util/SimpleLogger/simplog.c -o ./src/util/SimpleLogger/simplog.o

clean:
    rm -f $(PROG) $(OBJS)

1 个答案:

答案 0 :(得分:3)

这可能不是您要找的,但您可以通过以下方式将其包含在C ++文件中:

#ifdef __cplusplus
extern "C" {
#endif

// C code

#ifdef __cplusplus
}
#endif