I****y 发帖数: 1498 | 1 请教各位高手关于在linux下编译并行程序的两个问题,其中涉及到C语言编译器和C++
编译器的区别。
1. 我需要先编译一个lib,叫ParMetis,它是SuperLU_dist(并行SuperLU解线性稀疏方
程组)所需要的。 该库ParMetis需要用支持mpi的编译器编译,默认的mpicc可以编译,
也可以生成*.a的库文件,但有如下warning:
warning #266: function declared implicitly
GKfree(&your_adjncy, &your_adjwgt, &line, LTERM);
由于我的程序中有C++的成份,所以我改用mpiCC (支持mpi的C++编译器)来编译库
ParMetis. 却得到如下错误:
initpart.c(420): error: identifier "__GKfree" is undefined
GKfree(&bestwhere, &perm, LTERM);
我仔细找了一下,在rename.h里有如下语句
#define GKfree __GKfree
也 | t****t 发帖数: 6806 | 2 it said "__GKfree" is undefined, so the #define was recognized.
search for the declaration of __GKfree. C allows implicit declaration of
function, while C++ does not. if can't find, just declare one yourself.
【在 I****y 的大作中提到】 : 请教各位高手关于在linux下编译并行程序的两个问题,其中涉及到C语言编译器和C++ : 编译器的区别。 : 1. 我需要先编译一个lib,叫ParMetis,它是SuperLU_dist(并行SuperLU解线性稀疏方 : 程组)所需要的。 该库ParMetis需要用支持mpi的编译器编译,默认的mpicc可以编译, : 也可以生成*.a的库文件,但有如下warning: : warning #266: function declared implicitly : GKfree(&your_adjncy, &your_adjwgt, &line, LTERM); : 由于我的程序中有C++的成份,所以我改用mpiCC (支持mpi的C++编译器)来编译库 : ParMetis. 却得到如下错误: : initpart.c(420): error: identifier "__GKfree" is undefined
| t****t 发帖数: 6806 | 3 for 2, you probably need to enclose the declaration of fortran/C functions
by
extern "C" { ... }
you can do this:
#ifdef __cplusplus
extern "C" {
#endif
#include .....
#include ....
#ifdef __cplusplus
}
#endif
【在 I****y 的大作中提到】 : 请教各位高手关于在linux下编译并行程序的两个问题,其中涉及到C语言编译器和C++ : 编译器的区别。 : 1. 我需要先编译一个lib,叫ParMetis,它是SuperLU_dist(并行SuperLU解线性稀疏方 : 程组)所需要的。 该库ParMetis需要用支持mpi的编译器编译,默认的mpicc可以编译, : 也可以生成*.a的库文件,但有如下warning: : warning #266: function declared implicitly : GKfree(&your_adjncy, &your_adjwgt, &line, LTERM); : 由于我的程序中有C++的成份,所以我改用mpiCC (支持mpi的C++编译器)来编译库 : ParMetis. 却得到如下错误: : initpart.c(420): error: identifier "__GKfree" is undefined
| I****y 发帖数: 1498 | 4 太感谢trust的讲解了,
终于明白了原来C++是不支持implicit declearation的,
现在问题是GKfree的函数已经定义了,但为什么它没有被替换成__GKfree呢,define不
就是字符替换吗? 很奇怪为什么C++不能识别。
另外,C++里面有一个好的功能是用域。我有一个库是用C++写的,如果改用C编译器的
话,好像它不能识别域,怎么能让 C也能够识别域呢?
谢谢,鞠躬 | p****s 发帖数: 32405 | 5 你又打错他的名字了,
事实上本版95%的人不能正确拼写他的id, 可见这个名字取得很失败...
记住, thrust一定要H了才能使用!
先H, 再使用
一万遍
【在 I****y 的大作中提到】 : 太感谢trust的讲解了, : 终于明白了原来C++是不支持implicit declearation的, : 现在问题是GKfree的函数已经定义了,但为什么它没有被替换成__GKfree呢,define不 : 就是字符替换吗? 很奇怪为什么C++不能识别。 : 另外,C++里面有一个好的功能是用域。我有一个库是用C++写的,如果改用C编译器的 : 话,好像它不能识别域,怎么能让 C也能够识别域呢? : 谢谢,鞠躬
| P********e 发帖数: 2610 | 6
当然不是.
test using the #if defined and #ifdef
没办法,用file做域来区别,#include
【在 I****y 的大作中提到】 : 太感谢trust的讲解了, : 终于明白了原来C++是不支持implicit declearation的, : 现在问题是GKfree的函数已经定义了,但为什么它没有被替换成__GKfree呢,define不 : 就是字符替换吗? 很奇怪为什么C++不能识别。 : 另外,C++里面有一个好的功能是用域。我有一个库是用C++写的,如果改用C编译器的 : 话,好像它不能识别域,怎么能让 C也能够识别域呢? : 谢谢,鞠躬
| t****t 发帖数: 6806 | 7 1. how did you define/declare it?
did you define/declare using "GKfree", but declared BEFORE
#define GKfree __GKfree
?
2. Of course you can't use namespace (I assume you meant namespace) in C. If
you must, declare wrapper function in C++.
【在 I****y 的大作中提到】 : 太感谢trust的讲解了, : 终于明白了原来C++是不支持implicit declearation的, : 现在问题是GKfree的函数已经定义了,但为什么它没有被替换成__GKfree呢,define不 : 就是字符替换吗? 很奇怪为什么C++不能识别。 : 另外,C++里面有一个好的功能是用域。我有一个库是用C++写的,如果改用C编译器的 : 话,好像它不能识别域,怎么能让 C也能够识别域呢? : 谢谢,鞠躬
|
|