编译具有相同标题的C和C ++文件时未定义的引用

问题描述 投票:-1回答:1

为简短起见,我有一个CPP和C代码,我的CPP代码正尝试使用头文件引用C代码中的函数。每当我运行make命令时,最终都会遇到“未定义引用”错误。这是我的代码:

cpp_code.cpp:

extern "C"{
    #include "header_code.h";
}

int main(){
    cout << "Hello" << endl;
    return 0;
}

c_code.c:

#include "header_code.h"

int main(){
    printf("Hello");
    return 0;
}

void initalize(){
    printf("Initilized");
}

header_code.h:

extern void initalize();

makefile:

CXX = g++
CXXFLAGS = -std=c++11
CC = gcc
DEPS = header_code.h
CFLAGS = -I
OBJS = cpp_code.o c_code.o

c: $(OBJS) 
    $(CXX) -o $@ $^ $(CXXFLAGS)

%.o : %.cpp
    $(CXX) -c $(CXXFLAGS) $<

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

[每次跑步都会给我带来麻烦。谁能帮帮我吗?感谢您抽出宝贵的时间阅读所有这些内容!

c++ c c++11 makefile header
1个回答
0
投票

[basic.start.main]

在全局范围内声明变量main的程序,或在全局范围内声明连接到已命名模块的函数main的程序,或在C语言链接下声明名称main的程序(在任何名称空间)格式不正确。

所以,作为C++程序,它格式错误。删除C main功能。

其他问题:

在makefile中CFLAGS = -I编译之后的所有内容都将被视为用于搜索头文件的目录。在您的makefile中,这就是源文件。更正:CFLAGS =要么CFLAGS = -I.

您的头文件丢失了头保护,并且应该由C和C ++代码使用的头文件通常本身包含extern "C"部分,以免C ++用户添加它。

cpp_code.cpp

#include "header_code.h"
#include <iostream>

int main() {
    initalize(); // call the C function
    std::cout << "Hello" << std::endl;
}

c_code.c

#include "header_code.h"
#include <stdio.h>

void initalize(){
    printf("Initilized");
}

header_code.h

#ifndef HEADER_CODE_H_
#define HEADER_CODE_H_

#ifdef __cplusplus
extern "C" {
#endif

extern void initalize();

#ifdef __cplusplus
}
#endif

#endif

makefile

CXX = g++
CXXFLAGS = -std=c++11
CC = gcc
DEPS = header_code.h
CFLAGS = -I.
OBJS = cpp_code.o c_code.o

c: $(OBJS) 
    $(CXX) -o $@ $^ $(CXXFLAGS)

%.o : %.cpp
    $(CXX) -c $(CXXFLAGS) $<

%.o : %.c $(DEPS)
    $(CC) -c $(CFLAGS) $<
© www.soinside.com 2019 - 2024. All rights reserved.