Opencv+opencl c++プログラム移植心酸路


他の2つのノードでこのプログラムを実行したいので、帰らない道を歩きます.
メソッド1ノードごとに同じ環境を構成する
他のノードで構成されている環境は、元のマシンの環境と完全に同じである必要があります.ここには、1.コンパイル環境は同じ2.ffmpegバージョンは同じです(apt-getで直接ffmpegをダウンロードする場合、デフォルトで最新版のffmpegをダウンロードします.-version=xxxxでバージョンを指定すると、追加されたrepositoryが更新されているため、古いバージョンのffmpegを見つけることができません.)3.opencvバージョンは同じ4.Cudaバージョンは同じです
プログラムコンパイル時に静的ライブラリを追加
無責任なバージョンは次のとおりです.
g++ -static -Wl,--as-needed -o output function.cpp gaussian.cpp `pkg-config --static --cflags --libs opencv`

-static //    option
-Wl,--as-needed //       。
`pkg-config --static --cflags --libs opencv`

pkg-configコマンドの結果:
-I/usr/local/include/opencv -I/usr/local/include -I/usr/local/cuda-8.0/include -L/usr/local/lib -L/usr/local/cuda/lib64 -L/usr/local/share/OpenCV/3rdparty/lib -lopencv_cudabgsegm -lopencv_cudaobjdetect -lopencv_cudastereo -lopencv_shape -lopencv_stitching -lopencv_cudafeatures2d -lopencv_superres -lopencv_cudacodec -lopencv_videostab -lopencv_cudaoptflow -lopencv_cudalegacy -lopencv_calib3d -lopencv_features2d -lopencv_objdetect -lopencv_highgui -lopencv_videoio -lopencv_photo -lopencv_imgcodecs -lopencv_cudawarping -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_video -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_cudaarithm -lopencv_core -lopencv_cudev -llibjpeg -llibwebp -llibtiff -llibjasper -lIlmImf -lippicv -lQtOpenGL -lQtGui -lQtTest -lQtCore -lpng -lz -lgstbase-1.0 -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 -lgstvideo-1.0 -lgstapp-1.0 -lgstriff-1.0 -lgstpbutils-1.0 -lavcodec-ffmpeg -lavformat-ffmpeg -lavutil-ffmpeg -lswscale-ffmpeg -lstdc++ -ldl -lm -lpthread -lrt -lGLU -lGL -lcudart -lnppc -lnppi -lnpps -lcublas -lcufft -lOpenCL

-Iはヘッダファイル-Lはパス、-lはlibパッケージです.その無責任なバージョンを実行すると、libパッケージの一部がダイナミックであるため、「-lxxx」が見つからないとエラーが発生します.soファイル、静的ではありません.aファイルは、すべての静的コンパイルでは実行できません.
2番目のバージョン:(静的;動的に別々にコンパイル)
g++ -v -Wl,--as-needed -o output function.cpp gaussian.cpp -I/usr/local/cuda-8.0/include -I/usr/local/include -I/usr/local/include/opencv -I/usr/local/include/opencv2 -I/usr/include -I/usr/include/x86_64-linux-gnu -Wl,--as-needed -Wl,-Bdynamic -L/usr/lib/x86_64-linux-gnu -ldl -L/lib/x86_64-linux-gnu -L/usr/local/cuda/lib64 -L/usr/local/share/OpenCV/3rdparty/lib -llibjpeg -llibwebp -llibtiff -llibjasper -lIlmImf -lippicv -lQtOpenGL -lQtGui -lQtTest -lQtCore -lpng -lz -lgstbase-1.0 -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 -lgstvideo-1.0 -lgstapp-1.0 -lgstriff-1.0 -lgstpbutils-1.0 -lavcodec-ffmpeg -lavformat-ffmpeg -lavutil-ffmpeg -lswscale-ffmpeg -lstdc++ -lm -lpthread -lrt -lGLU -lGL -lcudart -lnppc -lnppi -lnpps -lcublas -lcufft -lOpenCL -Wl,-Bstatic -L/usr/local/lib -lopencv_ml -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_imgcodecs -Wl,-R/usr/local/lib/ -Wl,-R/usr/lib/ -Wl,-R/usr/local/ -Wl,--verbose

ちょっと散らかっています...主に利用しています
-Wl,-Bdynamic     -Wl, -Bstatic    

別々にコンパイルする.「-verbose」optionを強くお勧めします.並べ替えを助けることができます.この方法はプログラムを完全に移植することはできません.ほとんどが動的にコンパイルされているからです.
すべてのダイナミックlibをコピー
前の方法では、ほとんどが動的にコンパイルされているので、最も愚かな方法で、すべての動的libをプログラムの実行パスに追加したほうがいいですよ.利用可能
ldd        

実行可能ファイルのすべての依存ライブラリを検索します
ldd -u        

unused依存ライブラリのクエリー