为简短起见,我有一个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) $<
[每次跑步都会给我带来麻烦。谁能帮帮我吗?感谢您抽出宝贵的时间阅读所有这些内容!
在全局范围内声明变量
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) $<