Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译C和C+时未定义的引用+;具有相同头的文件_C++_C_C++11_Makefile_Header - Fatal编程技术网

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

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

简而言之,我有一个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();
生成文件:

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++代码所使用,通常包含 Extn“C”< /C>部分自己不负担C++用户添加它。 cpp_代码.cpp

生成文件

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