C++ 编译C和C+时未定义的引用+;具有相同头的文件
简而言之,我有一个CPP和C代码,我的CPP代码试图通过头文件引用C代码中的函数。无论何时运行make命令,最终都会出现“未定义引用”错误。这是我的密码: cpp_code.cpp:C++ 编译C和C+时未定义的引用+;具有相同头的文件,c++,c,c++11,makefile,header,C++,C,C++11,Makefile,Header,简而言之,我有一个CPP和C代码,我的CPP代码试图通过头文件引用C代码中的函数。无论何时运行make命令,最终都会出现“未定义引用”错误。这是我的密码: cpp_code.cpp: extern "C"{ #include "header_code.h"; } int main(){ cout << "Hello" << endl; return 0; } 标题_代码.h: extern void initalize(); 生成文件: CX
extern "C"{
#include "header_code.h";
}
int main(){
cout << "Hello" << endl;
return 0;
}
标题_代码.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) $<
CXX=g++
CXXFLAGS=-std=c++11
CC=gcc
DEPS=标题\代码.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++代码所使用,通常包含CXX=g++
CXXFLAGS=-std=c++11
CC=gcc
DEPS=标题\代码.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
函数?尝试指定您在将来的问题中遇到的确切错误。在发布示例代码之前,请确保您没有在示例代码中遇到完全不相关的错误。示例:CFLAGS=-I
将生成$,除非我拼写错误,我认为我没有拼写错误,我仍然得到一个对“initalize”错误的未定义引用。我真的很感谢你对我的回答如此透彻,非常感谢@AugustoCelis如果您只是从我的答案中复制文件(并确保makefile
在应该的位置获取字符),您将不会获得任何未定义的引用。你拼错了“initialize”,但我听之任之,它在所有3个文件中都拼写为“initialize”——所以,没有未定义的引用。它确实有效。很抱歉这么晚才回复,但非常感谢!
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) $<
#include "header_code.h"
#include <iostream>
int main() {
initalize(); // call the C function
std::cout << "Hello" << std::endl;
}
#include "header_code.h"
#include <stdio.h>
void initalize(){
printf("Initilized");
}
#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) $<