当前位置: 技术问答>linux和unix
关于gcc,g++编译的简单问题,大家帮帮我啊,急!!!
来源: 互联网 发布时间:2015-07-29
本文导语: 大家好: 我是一个刚学linux编程的菜鸟。最近正在做一个项目,项目里我自己编写了一个类,直接用gcc -o 编译,编译不通,于是我用g++ -o 编译,通过。 可是过了一阵,我还需要在主函数里面开...
大家好:
我是一个刚学linux编程的菜鸟。最近正在做一个项目,项目里我自己编写了一个类,直接用gcc -o 编译,编译不通,于是我用g++ -o 编译,通过。
可是过了一阵,我还需要在主函数里面开几个线程,于是我用pthread_create函数。用法如下:
#include "stdio.h"
#include "pthread.h"
void thread(void)
{
printf("just a test!");
return;
}
int main(void)
{
pthread_t id;
int ret = pthread_create(&id, NULL, (void*)thread, NULL);
pthread_join(id, NULL);
return 0;
}
可是,这次是g++ -lpthread -o 怎么也编不通,老报错:invalid conversion form 'void ' to 'void*',我把自己编写的类去掉,用gcc -lpthread -o 编译,就可以通过。请问如何是好!
总结一下,主要问题两点:1.gcc 能不能编译有类的工程,如果能,怎么编译
2.g++ 能不能编译有pthread_create的工程,如果能,怎么编译
提前谢谢大家,希望能给予指导!
雷子
我是一个刚学linux编程的菜鸟。最近正在做一个项目,项目里我自己编写了一个类,直接用gcc -o 编译,编译不通,于是我用g++ -o 编译,通过。
可是过了一阵,我还需要在主函数里面开几个线程,于是我用pthread_create函数。用法如下:
#include "stdio.h"
#include "pthread.h"
void thread(void)
{
printf("just a test!");
return;
}
int main(void)
{
pthread_t id;
int ret = pthread_create(&id, NULL, (void*)thread, NULL);
pthread_join(id, NULL);
return 0;
}
可是,这次是g++ -lpthread -o 怎么也编不通,老报错:invalid conversion form 'void ' to 'void*',我把自己编写的类去掉,用gcc -lpthread -o 编译,就可以通过。请问如何是好!
总结一下,主要问题两点:1.gcc 能不能编译有类的工程,如果能,怎么编译
2.g++ 能不能编译有pthread_create的工程,如果能,怎么编译
提前谢谢大家,希望能给予指导!
雷子
|
pthread_create(&id, NULL, (void*)thread, NULL);
~~~~~~~
要求function原型:void * start_routine(void *)
或pointer
void * (*start_routine)(void *)
~~~~~~~
要求function原型:void * start_routine(void *)
或pointer
void * (*start_routine)(void *)
|
看看这个你就会明白的:
#include
#include
#include
#include
class Worker {
public:
//这里要加上static
static void* my_worker_thread(void* some_arg ){
while (1) {
fputc ('1', stderr);
}
return NULL;
}
};
int main ()
{
pthread_t thread_id;
Worker myworker;
if( pthread_create (&thread_id, NULL, (Worker::my_worker_thread) , NULL) != 0 ){
fputs( "Error: pthread can't be createdn", stderr);
exit(1);
}
while (1) {
fputc ('0', stderr);
sleep(1);
}
return 0;
}
#include
#include
#include
#include
class Worker {
public:
//这里要加上static
static void* my_worker_thread(void* some_arg ){
while (1) {
fputc ('1', stderr);
}
return NULL;
}
};
int main ()
{
pthread_t thread_id;
Worker myworker;
if( pthread_create (&thread_id, NULL, (Worker::my_worker_thread) , NULL) != 0 ){
fputs( "Error: pthread can't be createdn", stderr);
exit(1);
}
while (1) {
fputc ('0', stderr);
sleep(1);
}
return 0;
}
|
首先,gcc是C编译器,g++是C++编译器,所以如果你用了C++的语法的话,就要用g++来编译。
其次,C++对很多地方,特别是类型转换做了严格的限制,所以你这里转换不了。需要这么写:
int ret = pthread_create(&id, NULL, void*(*)(void*)thread, NULL);
其次,C++对很多地方,特别是类型转换做了严格的限制,所以你这里转换不了。需要这么写:
int ret = pthread_create(&id, NULL, void*(*)(void*)thread, NULL);
|
gcc 是编译c的
g++是编译c++的,有类的就是c++了
g++是编译c++的,有类的就是c++了
|
invalid conversion form 'void ' to 'void*'
这句是说你的代码里,有错误。而不是编译错误。
有类就要用g++
这句是说你的代码里,有错误。而不是编译错误。
有类就要用g++
|
你要创建的线程执行是不是类的成员函数,如果是在定义函数前加上static应该就可以了
|
呵呵,UP!