单独键入每个库进行编译,但单个静态库存档失败

时间:2015-06-17 05:06:05

标签: c++ g++ ar

我正在尝试构建一个单独的库,以便通过单个-l开关轻松链接它。基本上如果我编译一个可执行文件并输出我的项目所需的所有库,如下所示:

g++ ncorr_test.cpp -o ncorr_test -I../include -I../../opencv/include/opencv2 -std=c++11 ../lib/ncorr.o ../lib/Strain2D.o ../lib/Disp2D.o ../lib/Data2D.o ../lib/ROI2D.o ../lib/Image2D.o ../lib/Array2D.o `pkg-config opencv --libs` ../../fftw/libs/libfftw3.a ../../SuiteSparse/SPQR/Lib/libspqr.a ../../SuiteSparse/CHOLMOD/Lib/libcholmod.a ../../SuiteSparse/SuiteSparse_config/libsuitesparseconfig.a ../../SuiteSparse/AMD/Lib/libamd.a ../../SuiteSparse/COLAMD/Lib/libcolamd.a ../../lapack/liblapack.a ../../blas/libs/libblas_LINUX.a /usr/lib/gcc/x86_64-linux-gnu/4.8/libgfortran.a

可执行文件编译并运行正常。但是,当我将所有库编译在一起时:

ar rvs libncorr.a ../lib/ncorr.o ../lib/Strain2D.o ../lib/Disp2D.o ../lib/Data2D.o ../lib/ROI2D.o ../lib/Image2D.o ../lib/Array2D.o `pkg-config opencv --libs` ../../fftw/libs/libfftw3.a ../../SuiteSparse/SPQR/Lib/libspqr.a ../../SuiteSparse/CHOLMOD/Lib/libcholmod.a ../../SuiteSparse/SuiteSparse_config/libsuitesparseconfig.a ../../SuiteSparse/AMD/Lib/libamd.a ../../SuiteSparse/COLAMD/Lib/libcolamd.a ../../lapack/liblapack.a ../../blas/libs/libblas_LINUX.a /usr/lib/gcc/x86_64-linux-gnu/4.8/libgfortran.a

然后编译如下:

g++ ncorr_test.cpp -o ncorr_test -I../include -I../../opencv/include/opencv2 -std=c++11 libncorr.a

我得到了一堆未定义的引用错误。我已使用libncorr.a检查了ar -t libncorr.a的内容,并打印出了我需要的所有库:

ncorr.o
Strain2D.o
Disp2D.o
Data2D.o
ROI2D.o
Image2D.o
Array2D.o
libopencv_calib3d.so
libopencv_core.so
libopencv_features2d.so
libopencv_flann.so
libopencv_highgui.so
libopencv_imgcodecs.so
libopencv_imgproc.so
libopencv_ml.so
libopencv_objdetect.so
libopencv_photo.so
libopencv_shape.so
libopencv_stitching.so
libopencv_superres.so
libopencv_ts.a
libopencv_video.so
libopencv_videoio.so
libopencv_videostab.so
libopencv_viz.so
libfftw3.a
libspqr.a
libcholmod.a
libsuitesparseconfig.a
libamd.a
libcolamd.a
liblapack.a
libblas_LINUX.a
libgfortran.a

库的顺序应该完全相同,所以我对这些未定义的引用存在的原因有点遗失。对于冗长的代码感到抱歉,但这实际上就是我使用的内容,所以我不想截断任何内容并可能使问题混淆。我有什么重要的东西我在这里失踪吗?

1 个答案:

答案 0 :(得分:1)

静态库只是 对象 文件的存档,但它并不完整。无论归档中的目标文件引用了哪些外部库,您都需要链接这些库。链接静态库与直接在归档中列出目标文件没什么不同。

您也不能将任何其他文件放在静态库中,链接器也不会使用它们。