Я пытаюсь создать единую библиотеку, чтобы ее можно было легко связать одним -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
Порядок библиотек должен быть точно таким же, поэтому я немного растерялся, почему существуют эти неопределенные ссылки. Извините за длинный код, но это буквально то, что я использую, поэтому я не хотел ничего обрезать и, возможно, скрыть проблему. Есть что-то, что я майор, я здесь скучаю?
Статическая библиотека — это просто архив объект файлы, это не завершено. На какие бы внешние библиотеки не ссылались объектные файлы в архиве, вам нужно связываться с ними. Связывание со статической библиотекой ничем не отличается от непосредственного перечисления объектных файлов в архиве.
Вы также не можете поместить другие файлы в статическую библиотеку, компоновщик не будет их использовать.