Linux下用g++编译c程序出错。。
我现在需要往一个C++程序里加功能,需要用另一个程序的源代码,但是那个程序是C写的,用原来那个程序的makefile的时候出了一堆诸如结构体Forbidden,node未...
我现在需要往一个C++程序里加功能,需要用另一个程序的源代码,但是那个程序是C写的,用原来那个程序的makefile的时候出了一堆诸如结构体Forbidden,node未定义的问题,请问有没有一个方法可以避免这个问题,让我可以同时编译并生成可执行程序?
PS:我实在懒得改了。。几千行的程序啊.急!
原来这个问题比想象中的严重多了,因为C++的代码里包含了一个C的头文件,所以编译铁定出错,期待牛人帮忙。。有人建议是,先把C的部分编译成一个静态库,但是我不知道怎么弄,求教中~恳请大家了~~我加分
明白啦,不过我还是想做成静态库,因为本来不是我的程序,改动太大也不太好,链个库算了,不知可否告诉我怎么做~(如果实在繁琐就算啦)
还是有问题。。我用了extern "C", 错误信息是一样的,诸如:
In file included from ancest2.cpp:28:
cons.h: error: ISO C++ forbids declaration of 'group_type' with no type.
我的静态库弄好了,用C编译器就没问题,这到底是怎么回事呢。。抓狂中 展开
PS:我实在懒得改了。。几千行的程序啊.急!
原来这个问题比想象中的严重多了,因为C++的代码里包含了一个C的头文件,所以编译铁定出错,期待牛人帮忙。。有人建议是,先把C的部分编译成一个静态库,但是我不知道怎么弄,求教中~恳请大家了~~我加分
明白啦,不过我还是想做成静态库,因为本来不是我的程序,改动太大也不太好,链个库算了,不知可否告诉我怎么做~(如果实在繁琐就算啦)
还是有问题。。我用了extern "C", 错误信息是一样的,诸如:
In file included from ancest2.cpp:28:
cons.h: error: ISO C++ forbids declaration of 'group_type' with no type.
我的静态库弄好了,用C编译器就没问题,这到底是怎么回事呢。。抓狂中 展开
5个回答
展开全部
我用一个例子来告诉你怎么样在 C++ 里使用C的头文件/函数。
比方说我有一个C的头文件叫 c.h, C的源码文件叫 c.c,内容分别是
c.h:
#ifndef _ASDFD_INCLUDED_
#define _ASDFD_INCLUDED_
#include <stdio.h>
extern int test(int a);
#endif
c.c:
#include "c.h"
int test(int a)
{
printf("A = %d\n", a);
return a*a;
}
现在我想在c++中使用c.c中提供的函数test(),我的c++文件名字叫 a.cpp,那么里面跟C有关的部分就要用 extern "C" {} 大括号括起来,看看我的
a.cpp:
#include <iostream>
using namespace std;
extern "C"
{
#include "c.h"
}
int main()
{
int b = 12;
b = test(b);
cout<<"b = "<<b<<endl;
return 0;
}
看到了吧,#include "c.h" 被 extern "C" {}括起来了。
然后是如何编译,先把C文件编出目标文件(.o)来
gcc -c c.c
你会看到生成了 c.o,其实,有目标文件就够了,如果你一定要做成(静态/动态)库文件,也是可以的,不过我这里就不深入了,做成库和直接用目标文件对解决你的问题没有任何区别。
然后再编译C++文件,也就是我的 a.cpp
g++ -o hello a.cpp c.o
看到了吧,我在编译 a.cpp 的时候把C生成的 c.o也加上了。 然后生成 可执行的 hello, 运行
./hello
就可以看到
A = 12
b = 144
关于创建静态库,假定你有3个C文件, a.c, b.c, c.c 提供了你C++要用到的接口,那么可以把这三个C文件编译出来的目标文件放到一个库文件里供C++使用,方法为
先编译出目标文件
gcc -c a.c b.c c.c
这时候你应该看到有 a.o b.o c.o了
然后创建库文件
ar cr libtest.a a.o b.o c.o
这三个目标文件就放入 libtest.a 这个静态库中了,然后编译C++程序 (你的C++程序应该已经按照我前面说的用 extern "C" 把C的接口都括起来了),假定你的 libtest.a 放在 /home/aaa/lib下
g++ -o my.exe my.cpp -L/home/aaa/lib -ltest
就会生成可执行文件 my.exe了。
比方说我有一个C的头文件叫 c.h, C的源码文件叫 c.c,内容分别是
c.h:
#ifndef _ASDFD_INCLUDED_
#define _ASDFD_INCLUDED_
#include <stdio.h>
extern int test(int a);
#endif
c.c:
#include "c.h"
int test(int a)
{
printf("A = %d\n", a);
return a*a;
}
现在我想在c++中使用c.c中提供的函数test(),我的c++文件名字叫 a.cpp,那么里面跟C有关的部分就要用 extern "C" {} 大括号括起来,看看我的
a.cpp:
#include <iostream>
using namespace std;
extern "C"
{
#include "c.h"
}
int main()
{
int b = 12;
b = test(b);
cout<<"b = "<<b<<endl;
return 0;
}
看到了吧,#include "c.h" 被 extern "C" {}括起来了。
然后是如何编译,先把C文件编出目标文件(.o)来
gcc -c c.c
你会看到生成了 c.o,其实,有目标文件就够了,如果你一定要做成(静态/动态)库文件,也是可以的,不过我这里就不深入了,做成库和直接用目标文件对解决你的问题没有任何区别。
然后再编译C++文件,也就是我的 a.cpp
g++ -o hello a.cpp c.o
看到了吧,我在编译 a.cpp 的时候把C生成的 c.o也加上了。 然后生成 可执行的 hello, 运行
./hello
就可以看到
A = 12
b = 144
关于创建静态库,假定你有3个C文件, a.c, b.c, c.c 提供了你C++要用到的接口,那么可以把这三个C文件编译出来的目标文件放到一个库文件里供C++使用,方法为
先编译出目标文件
gcc -c a.c b.c c.c
这时候你应该看到有 a.o b.o c.o了
然后创建库文件
ar cr libtest.a a.o b.o c.o
这三个目标文件就放入 libtest.a 这个静态库中了,然后编译C++程序 (你的C++程序应该已经按照我前面说的用 extern "C" 把C的接口都括起来了),假定你的 libtest.a 放在 /home/aaa/lib下
g++ -o my.exe my.cpp -L/home/aaa/lib -ltest
就会生成可执行文件 my.exe了。
展开全部
报什么错误?发个截图、你编译的命令、系统环境等信息发出来呗,就一句用g++编译C程序出错,鬼知道是你程序的问题还是编译命令的问题~~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2010-03-19
展开全部
改用GCC编译C程序.
makefile就相当于一个批处理文件,可以放任何需要执行的命令,所以在同一个MAKEFILE中既用GCC又用G++也是可以的.最后的连接会不会出错完全与MAKE无关,要检查你的程序自身.
makefile就相当于一个批处理文件,可以放任何需要执行的命令,所以在同一个MAKEFILE中既用GCC又用G++也是可以的.最后的连接会不会出错完全与MAKE无关,要检查你的程序自身.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
爱莫能助啊,我最近也在搞,硬着头皮问人呗。祝你好运
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的程序有问题啊哈
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |