http://my.oschina.net/victorlovecode/blog/344324?fromerr=04Wwy9Vr 2014 从http://www./software/gsl/上下载, 按照提示安装之后,一切没有问题, 但是把manual中给出的例子拿来算, 却总不能编译成功. 错误信息为头文件中定义的函数函数没有定义. 像下面的例子中, #include <stdio.h> #include <gsl/gsl_block_double.h> int main() { gsl_block * b = gsl_block_alloc(100); printf("length of block = %u\n", b->size); printf("block data address = %#x\n", b->data); gsl_block_free(b); return 0; } 编译链接会提示:undefined reference to gsl_block_alloc….. collection 2: ld …… 查看/usr/local/include/gsl(默认安装路径)中gsl_block_double.h 发现其中包含了函数声明, 但是没有函数定义.
感谢网友,从网上找到了答案.在编译的时候,编译器只要求有函数原型即可. 但是,在链接的时候(ld为链接程序),则需要函数的具体定义,所以,在链接的 时候需要把已经编译好的库也链接过来, 而不能只包含头文件.
从http:///showthread.php?t=270924得知, 可以使用pkg-config –libs gsl来查询使用该库的时候所需的链接选项, 我的是 : -L/usr/local/lib -lgsl -lgslcblas -lm 另外, 可以使用pkg-config –cflags gsl 会给出编译时需要的编译选项. 如果提示 Package gsl was not found in the pkg-config search path. Perhaps you should add the directory containing `gsl.pc’ to the PKG_CONFIG_PATH environment variable 把相应的/usr/local/lib/pkgconfig 加入环境变亮 PKG_CONFIG_PATH中就可以了 一种做法是在自己目录下 .bash_profile中加入 PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH export PKG_CONFIG_PATH 然后, source .bash_profile 即可. 另外,也可以直接在终端输入 PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH export PKG_CONFIG_PATH 但这只对当前终端窗口适用.
按照这样的编译选项编译之后,运行时 还可能提示出错, 如
$ ./a.out
./a.out: error while loading shared libraries:
libgsl.so.0: cannot open shared object file: No such
file or directory.
这时候, 需要建立LD_LIBRARAY_PATH 的环境变亮.
LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
同样可以加入.bash_profile 中,
这样再运行时就没有问题了.
参考:http://wiki./ITS/High_Performance_Computing_Cluster/help_on_GSL
|