文章目录
-
- 安装最新版
-
- 下载最新版:
- 解压并且安装(官网安装)
- 报错并相关的解决方法:
-
- [存在perl的问题,利用conda 安装新的perl,不用系统自身的。](#存在perl的问题,利用conda 安装新的perl,不用系统自身的。)
- 编译的时候strings.h文件中的strdup函数声明冲突。
- 找不到链接器(ld)找不到系统上的LAPACK库(-llapack)
- 总结
安装最新版
可以在github链接找到最新版本,结下来我会以安装最新版,作为例子进行介绍
下载最新版:
bash
https://github.com/ViennaRNA/ViennaRNA/releases/download/v2.6.4/ViennaRNA-2.6.4.tar.gz
解压并且安装(官网安装)
bash
tar -zxvf ViennaRNA-2.6.4.tar.gz
cd ViennaRNA-2.6.4
./configure --prefix=/home/xxx/ViennaRNA-2.6.4
make install
报错并相关的解决方法:
存在perl的问题,利用conda 安装新的perl,不用系统自身的。
问题类似这个blog:blog
bash
conda install -c conda-forge perl
编译的时候strings.h文件中的strdup函数声明冲突。
问题:
make[1]: Entering directory /home/xxxx/ViennaRNA-2.6.4/src/RNAxplorer' Making install in src make[2]: Entering directory
/home/xxxx/ViennaRNA-2.6.4/src/RNAxplorer/src'
CC RNAxplorer_cmdl.o
CC RNAxplorer.o
In file included from /usr/include/string.h:633,
from RNAxplorer.c:3:
.../.../.../src/ViennaRNA/utils/strings.h:64:1: error: expected identifier or '(' before 'extension '
strdup(const char *s);
^~~~~~
make[2]: *** [RNAxplorer.o] Error 1
解释:
这个错误信息表明在编译ViennaRNA包的RNAxplorer部分时遇到了问题。错误是由于strings.h文件中的strdup函数声明冲突。在包含了系统的string.h头文件之后,strdup的声明与ViennaRNA包自己的strings.h中的声明发生了冲突。
这可能是因为strdup是一个标准的库函数,而在某些系统中,比如GNU libc,它是非标准的扩展,可能会被条件编译指令保护起来。
因此:
检查ViennaRNA的strings.h是否有条件编译指令来防止与标准库的strdup冲突。
1。 找到strings.h文件的位置。如果您已经知道ViennaRNA的安装目录,您可以在其中搜索该文件。
2。 打开strings.h文件并查看文件内容。您可以使用文本编辑器打开它,例如:
vim /path/to/ViennaRNA/src/ViennaRNA/utils/strings.h
3。在文件中查找strdup相关的定义和声明。特别是寻找#ifdef或#ifndef预处理器指令,这些指令可能用来检查某个宏是否已定义,以决定是否需要声明strdup。例如:
#ifndef HAVE_STRDUP
char *
strdup(const char *s);
#endif
分析原因:
既然strings.h中的strdup函数是用条件编译宏#ifndef HAVE_STRDUP包围的,这意味着如果HAVE_STRDUP没有在编译前定义,ViennaRNA就会尝试自己声明strdup函数。这通常会导致和系统的string.h头文件中的声明冲突。
4。 解决办法:
添加编译选项:
如果您直接使用make来编译ViennaRNA,可以尝试在make命令中添加CFLAGS:
make CFLAGS='-DHAVE_STRDUP'
这会将HAVE_STRDUP定义传递给编译器。
找不到链接器(ld)找不到系统上的LAPACK库(-llapack)
1) 首先利用conda 安装
conda install -c conda-forge liblapack
2)需要将包含LAPACK库的目录添加到您的LD_LIBRARY_PATH环境变量中
bash
export LD_LIBRARY_PATH=/home/xxxx/condaenvs/xxxx/lib:$LD_LIBRARY_PATH
就是将下面两个文件放入LD_LIBRARY_PATH中:
原因:
liblapack.so 和 liblapack.so.3 是LAPACK库在Linux系统中的共享库文件。共享库(或动态链接库)是一种包含可以被其他程序调用的代码和数据的文件。在这种情况下,LAPACK库的功能被封装在这些共享库文件中,以便其他程序可以在运行时链接和使用它们。
在Linux系统中,共享库文件通常有以下几种类型:
.so 文件:这是一个"共享对象"(shared object)文件,它是在编译时用于动态链接的文件。
版本化的 .so 文件:例如 liblapack.so.3,这表示库的特定版本,确保软件链接到正确的库版本。这样可以防止软件更新后因为库版本不兼容而产生问题。
当链接器在编译过程中发出错误,提示找不到 -llapack 时,它通常是在寻找名为 liblapack.so 的文件。如果您已经有了这些文件,那么您可能需要确保它们位于链接器查找共享库的路径上,或者在编译时指定它们的位置。
如果这些文件不在标准的库路径下,您可以:
使用 -L 选项在编译时指定库的路径。
将库的路径添加到 LD_LIBRARY_PATH 环境变量中。
配置 /etc/ld.so.conf 或 /etc/ld.so.conf.d/ 中的文件,然后运行 ldconfig 来更新运行时链接器的配置。
但是好像还是会出现相同的错误当重新make install
bash
ldconfig -p | grep lapack
如果运行 ldconfig -p | grep lapack 没有任何输出,说明 liblapack.so 没有在系统的链接器缓存中注册。这可能是因为:
1. LAPACK库没有安装在标准库路径:系统链接器可能只会自动扫描某些标准路径(如 /lib, /usr/lib, /usr/local/lib),如果LAPACK库不在这些路径中,链接器就不会自动找到它。
2. /etc/ld.so.conf 和 /etc/ld.so.conf.d/ 没有正确配置:这些文件控制了链接器应该扫描哪些路径。如果您将库安装在非标准路径,您需要将该路径添加到这些配置文件中,然后运行 sudo ldconfig 来更新链接器的缓存。
3. 运行 ldconfig 需要管理员权限:更新系统链接器缓存通常需要管理员权限。确保您使用 sudo ldconfig 来刷新缓存。
综上所有错误,提供的最终的解决措施
在使用 ./configure 脚本配置源代码包时,您可以通过设置环境变量 LDFLAGS 来指定链接器应该在哪里查找库文件。LDFLAGS 可以用来添加链接器的选项,-L 用于添加库的搜索路径,-Wl,-rpath 用于设置运行时的库搜索路径。
以下是如何在 ./configure 命令中指定库路径的步骤:
1。 设置 LDFLAGS:
bash
LDFLAGS="-L/home/xxxx/condaenvs/xxxxx/lib -Wl,-rpath,/home/xxxx/condaenvs/xxxx/lib"
2。运行 ./configure:
bash
./configure LDFLAGS="$LDFLAGS" --prefix=/home/xxxx/ViennaRNA-2.6.4
3。编译并安装:
bash
make CFLAGS='-DHAVE_STRDUP'
make install
确保在运行 ./configure 命令之前,已经设置了 LDFLAGS 环境变量,并且包含了LAPACK库的正确路径。
successfully!!!
所有可执行文件都在:
/home/xxxx/ViennaRNA-2.6.4/bin
总结
一般需要编译的时候,可以先安装conda环境,安装gcc/g++,安装perl等重要信息.