簡體   English   中英

編譯具有相同標頭的 C 和 C++ 文件時未定義的引用

[英]Undefined reference when compiling a C and C++ file with same header

簡而言之,我有一個 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) $<

每當運行 make 它總是給我帶來問題。 誰能幫幫我嗎? 感謝您花時間閱讀所有這些!

[基本.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) $<

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM