为了简短起见,我有一个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();


生成文件:

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) $<


每当运行它总是给我带来问题。谁能帮帮我吗?感谢您抽出宝贵的时间阅读所有这些内容!

最佳答案

[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


生成文件

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) $<

07-24 09:52
查看更多