无法在libpca

时间:2018-05-04 02:15:08

标签: linux gcc dll environment-variables undefined-reference

我正在尝试安装libpca软件包。 我已经安装了犰狳。

libpca包解压缩到/my/dir/。我将CPLUS_INCLUDE_PATH和其他变量设置为Armadillo安装的位置。 (export CPLUS_INCLUDE_PATH=/my/dir/arma_install/include/:$CPLUS_INCLUDE_PATH

我运行以下命令来安装libpca:

/my/dir/libpca-1.3.3$  ./configure --prefix=/my/dir/libpca-1.3.3
/my/dir/libpca-1.3.3$  make

有警告但没有错误。命令:

/my/dir/libpca-1.3.3$  make install prefix=/my/dir/libpca-1.3.3

看起来很好,并且没有报告错误。

然后我尝试在/my/dir/libpca-1.3.3/examples/simple/pca_example.cpp中编译并运行示例文件。在dir examples中,我运行

/my/dir/libpca-1.3.3/examples$  make

返回

  

make [1]:没有什么可以做的'所有'

     

make [1]:没有什么可以做的,所有的'

并且没有创建新文件。然后我进入examples/simple,然后运行

/my/dir/libpca-1.3.3/examples/simple$  make

它返回:

  

make:没有什么可以为所有'

做的

并且没有创建新文件。然后我跑

/my/dir/libpca-1.3.3/examples/simple$  make check

它返回以下错误:

上述错误中的变量wrapper_dsyev_wrapper_dgemv_wrapper_dgemm_等存在于以下二进制文件中:

/my/dir/arma_install/lib64/libarmadillo.so.8.500.0
/my/dir/arma_downloaded/CMakeFiles/armadillo.dir/src/wrapper.cpp.o
/my/dir/arma_downloaded/CMakeFiles/CMakeRelink.dir/libarmadillo.so.8.500.0

export进入LD_LIBRARY_PATH后,仍会返回相同的错误。

我认为包含路径和环境变量应该有问题。我该如何解决?

此外,如果我需要在/my/dir/working_dir/中编写代码,我该如何设置路径?

----------------------------------编辑如下----------- ---------

当我进行下述更新时,请执行步骤3:

/my/dir/libpca-1.3.3$ LD_LIBRARY_PATH=/my/dir/arma_install/lib64 make check

它返回以下错误:

  

LD_LIBRARY_PATH = / my / dir / arma_install / lib64 / make check

     

在src / lib中进行检查

     

make [1]:输入目录`/my/dir/libpca-1.3.3/src/lib'

     

make [1]:离开目录`/my/dir/libpca-1.3.3/src/lib'

     

进行检查

     

make [1]:进入目录`/my/dir/libpca-1.3.3/test'

     

make unittest

     

make [2]:进入目录`/my/dir/libpca-1.3.3/test'

     

/ bin / sh ../libtool --tag = CXX --mode = link g ++ -I ../ src / lib
  -pthread -O2 -o unittest main.o testcases.o test_pca.o test_utils.o ../src/lib/.libs/libpca.a -L / my / dir / source_scripts / lib64

     

libtool:link:g ++ -I ../ src / lib -pthread -O2 -o unittest main.o   testcases.o test_pca.o test_utils.o ../src/lib/.libs/libpca.a   -L / my / dir / arma_install / lib64 -pthread

     

test_utils.o:在函数`void arma :: glue_times :: apply,arma :: Mat

     
    

(arma :: Mat&,arma :: Mat const&,arma :: Mat const&,double)':

  
     

test_utils.cpp :( text.hot._ZN4arma10glue_times5applyIdLb1ELb0ELb1ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4 _ [_ _ ZN4arma10glue_times5applyIdLb1ELb0ELb1ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4] + 0x169):   对'wrapper_dgemm _'

的未定义引用      

test_utils.cpp :( text.hot._ZN4arma10glue_times5applyIdLb1ELb0ELb1ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4 _ [_ _ ZN4arma10glue_times5applyIdLb1ELb0ELb1ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4] + 0x363):   对'wrapper_dgemv _'

的未定义引用      

test_utils.cpp :( text.hot._ZN4arma10glue_times5applyIdLb1ELb0ELb1ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4 _ [_ _ ZN4arma10glue_times5applyIdLb1ELb0ELb1ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4] + 0x45c):   未定义的引用`wrapper_dsyrk _'

     

../ src / lib / .libs / libpca.a(pca.o):在功能上   `统计:: PCA :: bootstrap_eigenvalues _()':

     

pca.cpp :(。text + 0x454d):对`wrapper_dsyev _'

的未定义引用      

pca.cpp :(。text + 0x4953):对`wrapper_dsyevd _'

的未定义引用      

../ src / lib / .libs / libpca.a(pca.o):在函数`bool中   ARMA :: auxlib :: eig_sym_dc

     
    

(arma :: Col&,arma :: Mat&,arma :: Base> const&)':

  
     

pca.cpp :( text._ZN4arma6auxlib10eig_sym_dcIdNS_3MatIdEEEEbRNS_3ColIT_EERNS2_IS5_EERKNS_4BaseIS5_T0_EE [_ZN4arma6auxlib10eig_sym_dcIdNS_3MatIdEEEEbRNS_3ColIT_EERNS2_IS5_EERKNS_4BaseIS5_T0_EE] + 0x13a):   对`wrapper_dsyevd _'

的未定义引用      

../ src / lib / .libs / libpca.a(pca.o):在函数`bool中   ARMA :: eig_sym

     
    

(arma :: Col :: pod_type>&,arma :: Mat :: elem_type>&,     arma :: Base :: elem_type,arma :: Mat>常量和放大器;,     char const *,     ARMA :: arma_blas_type_only :: elem_type> ::结果     常量*)':

  
     

pca.cpp :( text._ZN4arma7eig_symINS_3MatIdEEEEbRNS_3ColINT_8pod_typeEEERNS1_INS4_9elem_typeEEERKNS_4BaseIS8_S4_EEPKcPKNS_19arma_blas_type_onlyIS8_E6resultE [_ZN4arma7eig_symINS_3MatIdEEEEbRNS_3ColINT_8pod_typeEEERNS1_INS4_9elem_typeEEERKNS_4BaseIS8_S4_EEPKcPKNS_19arma_blas_type_onlyIS8_E6resultE] +量0x1A0):   未定义的引用`wrapper_dsyev _'

     

../ src / lib / .libs / libpca.a(pca.o):在函数`double中   arma :: auxlib :: det_lapack(arma :: Mat const&,bool)':

     

pca.cpp :( text._ZN4arma6auxlib10det_lapackIdEET_RKNS_3MatIS2_EEb [_ZN4arma6auxlib10det_lapackIdEET_RKNS_3MatIS2_EEb] + 0x117):   对'wrapper_dgetrf _'

的未定义引用      

../ src / lib / .libs / libpca.a(pca.o):在函数`void arma :: gemv :: apply_blas_type>(double *,   arma :: Mat const&,double const *,double,double)':

     

pca.cpp :( text._ZN4arma4gemvILb1ELb0ELb0EE15apply_blas_typeIdNS_3MatIdEEEEvPT_RKT0_PKS5_S5_S5 _ [_ _ ZN4arma4gemvILb1ELb0ELb0EE15apply_blas_typeIdNS_3MatIdEEEEvPT_RKT0_PKS5_S5_S5] + 0x86可以):   对'wrapper_dgemv _'

的未定义引用      

../ src / lib / .libs / libpca.a(pca.o):在函数`void arma :: gemv :: apply_blas_type>(double *,   arma :: Mat const&,double const *,double,double)':

     

pca.cpp :( text._ZN4arma4gemvILb0ELb0ELb0EE15apply_blas_typeIdNS_3MatIdEEEEvPT_RKT0_PKS5_S5_S5 _ [_ _ ZN4arma4gemvILb0ELb0ELb0EE15apply_blas_typeIdNS_3MatIdEEEEvPT_RKT0_PKS5_S5_S5] + 0x86可以):   对'wrapper_dgemv _'

的未定义引用      

../ src / lib / .libs / libpca.a(pca.o):在函数`void   arma :: glue_times :: apply,arma :: Mat>(arma :: Mat&amp ;,,   arma :: Mat const&,arma :: Mat const&,double)':

     

pca.cpp :( text.hot._ZN4arma10glue_times5applyIdLb0ELb0ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4 _ [_ _ ZN4arma10glue_times5applyIdLb0ELb0ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4] + 0x129):   对'wrapper_dgemm _'

的未定义引用      

pca.cpp :( text.hot._ZN4arma10glue_times5applyIdLb0ELb0ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4 _ [_ _ ZN4arma10glue_times5applyIdLb0ELb0ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4] + 0x334):   对'wrapper_dgemv _'

的未定义引用      

../ src / lib / .libs / libpca.a(pca.o):在函数`void   ARMA :: glue_times ::申请,   arma :: Mat>(arma :: Mat&,arma :: Mat const&amp ;,,   arma :: Mat const&,double)':

     

pca.cpp :( text.hot._ZN4arma10glue_times5applyIdLb0ELb1ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4 _ [_ _ ZN4arma10glue_times5applyIdLb0ELb1ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4] + 0x14a):   对'wrapper_dgemm _'

的未定义引用      

pca.cpp :( text.hot._ZN4arma10glue_times5applyIdLb0ELb1ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4 _ [_ _ ZN4arma10glue_times5applyIdLb0ELb1ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4] + 0x33c):   未定义的引用`wrapper_dsyrk _'

     

../ src / lib / .libs / libpca.a(utils.o):在函数中   `stats :: utils :: compute_column_rms(arma :: Mat const&)':

     

utils.cpp :(。text + 0xe95):对`wrapper_ddot _'

的未定义引用      

../ src / lib / .libs / libpca.a(utils.o):在函数`void   ARMA :: glue_times ::申请,   arma :: Mat>(arma :: Mat&,arma :: Mat const&amp ;,,   arma :: Mat const&,double)':

     

utils.cpp :( text.hot._ZN4arma10glue_times5applyIdLb1ELb0ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4 _ [_ _ ZN4arma10glue_times5applyIdLb1ELb0ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4] + 0x353):   对'wrapper_dgemm _'

的未定义引用      

utils.cpp :( text.hot._ZN4arma10glue_times5applyIdLb1ELb0ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4 _ [_ _ ZN4arma10glue_times5applyIdLb1ELb0ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4] + 0x8a4):   对'wrapper_dgemv _'

的未定义引用      

utils.cpp :( text.hot._ZN4arma10glue_times5applyIdLb1ELb0ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4 _ [_ _ ZN4arma10glue_times5applyIdLb1ELb0ELb0ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4] + 0x9ab):   未定义的引用`wrapper_dsyrk _'

     

collect2:错误:ld返回1退出状态

     

make [2]:*** [unittest]错误1

     

make [2]:离开目录`/my/dir/libpca-1.3.3/test'

     

make [1]:*** [check-am]错误2

     

make [1]:离开目录`/my/dir/libpca-1.3.3/test'

     

make:*** [check-recursive]错误1

接下来我该怎么做?

1 个答案:

答案 0 :(得分:1)

您需要告诉链接器您的犰狳库的位置。您可以通过两种方式实现这一目标:

  1. 通过环境变量:export LIBRARY_PATH=/arma/lib:$LIBRARY_PATH
  2. 通过armadillo include和库路径直接配置: ./configure --with-armadillo-incdir=/arma/include --with-armadillo-libdir=/arma/lib
  3. 我建议使用选项2,因为它可以防止设置额外的环境变量,这些变量可能会污染您的环境。

    请注意,--prefix表示安装libpca的目录。这应该与源目录不同!

    配置完成后,您可以投放makemake checkmake install。要使make check成功,linux库加载器需要知道armadillo共享库的位置。因此,一个选项就是这样运行:LD_LIBRARY_PATH=/arma/lib make check

    总结您需要运行的命令:

    1. ./configure --prefix=/libpca/install --with-armadillo-incdir=/arma/include --with-armadillo-libdir=/arma/lib
    2. make
    3. LD_LIBRARY_PATH=/arma/lib make check
    4. make install
    5. 显然,您需要根据自己的情况调整路径。

      警告:在某些平台上,您需要显式链接lapack和blas。因此,如果您遇到更多链接器错误,请尝试像这样配置: LIBS='-llapack -lblas' ./configure --prefix=/libpca/install --with-armadillo-incdir=/arma/include --with-armadillo-libdir=/arma/lib