无法在 libpca 中编译示例代码

Cannot compile example code in libpca

我正在尝试安装 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 中的示例文件。在目录 examples 中,我 运行

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

它returns

make[1]: Nothing to be done for 'all'

make[1]: Nothing to be done for 'all-am'

并且没有创建新文件。然后我 cd 到 examples/simple 和 运行

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

它returns:

make: Nothing to be done for 'all'

并且没有创建新文件。那我运行

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

它returns出现以下错误:

上述错误中的变量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后,还是报同样的错误

我觉得include路径和环境变量应该有问题。我该如何解决?

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

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

当我进行如下所述的更新时,在第 3 步:

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

它returns出现以下错误:

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

Making check in src/lib

make[1]: Entering directory `/my/dir/libpca-1.3.3/src/lib'

make[1]: Leaving directory `/my/dir/libpca-1.3.3/src/lib'

Making check in test

make[1]: Entering directory `/my/dir/libpca-1.3.3/test'

make unittest

make[2]: Entering directory `/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: In function `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): 在函数中 `stats::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 > const&, char const*, arma::arma_blas_type_only::elem_type>::result const*)':

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&, 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::apply, arma::Mat >(arma::Mat&, arma::Mat const&, 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::apply, arma::Mat >(arma::Mat&, arma::Mat const&, 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: *** [检查递归] 错误 1

接下来我该做什么?

您需要告诉 linker 您的犰狳图书馆的位置。您可以通过两种方式实现此目的:

  1. 通过环境变量:export LIBRARY_PATH=/arma/lib:$LIBRARY_PATH
  2. 通过armadillo include和库路径直接配置: ./configure --with-armadillo-incdir=/arma/include --with-armadillo-libdir=/arma/lib

我建议使用选项 2,因为它可以防止设置额外的环境变量,这可能会污染您的环境。

请注意,--prefix 表示安装 libpca 的目录。这应该和源码目录不一样!

配置后您可以 运行 makemake checkmake install。为了 make check 成功,linux 库加载器需要知道犰狳共享库的位置。所以一种选择是 运行 像这样: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

显然,您需要根据自己的情况调整路径。

警告:在某些平台上,您需要明确 link 使用 lapack 和 blas。因此,如果您 运行 陷入进一步的 linker 错误,请尝试这样配置: LIBS='-llapack -lblas' ./configure --prefix=/libpca/install --with-armadillo-incdir=/arma/include --with-armadillo-libdir=/arma/lib