我意识到这个问题已经被问了很多种方式,包括这个非常全面的答案,但我看了很多,并试图纠正我的错误,但都无济于事。
我正在使用.cpp和.c文件来创建一个程序。我用g++编译了所有文件,它似乎没有更多的链接错误,尽管它给了我一些与C语法相关的C++错误。这是我使用的命令:
g++ -o program main.cpp /data/*.c -l[...libs]
main.cpp调用.c文件中的函数。然后我明白了,不应该试图用一个编译器同时编译.c和.cpp文件,而应该用gcc来编译其中一个,g++来编译另一个,然后简单地链接对象文件。
所以我做了这个(.c文件是库的一部分,并且已经有了.o文件)
g++ -c main.cpp
g++ -o program main.o /data/*.o -l[..libs]
但在这里,我将获得从main.cpp调用到预编译.c文件的函数的"未定义引用"错误,这些错误我以前没有得到。
有人能帮忙吗?或者我可能需要提供更多信息?
EDIT(一个更深入的代码摘录,我已经尝试过简化,否则这将无法阅读,但请告诉我,如果我仍然需要添加内容,我会尝试删除不必要的代码):
main.cpp:
#include "header.h"
int main(int argc, char** argv) {
string s1 = argv[2];
fn1(s1)
}
header.h
void fn1(string s1)
mycfile.c
#include "header.h"
void fn1(string s1){
fprintf(stdout, " you entered %s", s1);
fflush(stdout);
}
答案:
@Smeehey帮我找到了解决方案,实际上我还在使用的.hpp文件中包含旧的头。但核心解决方案实际上是使用外部C{}。
这很可能与C-vs-C++链接有关。在你的main.cpp
中,你可能有这样的东西:
#include <data/header.h>
其中header.h
指的是您的c库。更换如下:
extern "C" {
#include <data/header.h>
}
这个命令告诉您的c++编译器在定义头中所需的符号时不要使用c++样式的名称篡改,这样链接器就可以在c编译的.o
文件中成功地找到它们。
您必须使用gcc
命令编译C文件,使用gcc
或g++
编译C++文件,并使用g++
命令进行链接。这个序列可能会起作用:
gcc -c data/*.c main.cpp
g++ -o program *.o -l <libs...>
下一步:学习编写正确的makefile。
这是一个黑暗中的镜头,但问题可能是C和编译的Cpp文件相似但略有不同。。。。由于名称空间,函数foo
将生成符号some_prefix@foo
与C不同,goo
生成符号goo
尝试在.cpp文件中执行以下操作
extern "C"
{
#include "yourcfilesheader.h"
}
请附上您的代码