如果這是一個幼稚的問題,我很抱歉,因為我一般對 CMake 很不熟悉。
我正在嘗試編譯一個非常大的開源軟體專案(OpenCV)。我似乎已經使用以下命令列引數將大多數所需的庫放入路徑中。
-DCUDNN_INCLUDE_DIR='${CONDA_PREFIX}/include' \
-DCUDNN_LIBRARY='/${CONDA_PREFIX}/lib' \
-DC_INCLUDE_PATH=${CONDA_PREFIX}/include:/usr/local/include:/usr/include/x86_64-linux-gnu: \
-DINCLUDE_PATH=${CONDA_PREFIX}/include:/usr/local/include:/usr/include/x86_64-linux-gnu \
-DC_PATH=${CONDA_PREFIX}/include:/usr/local/include:/usr/include/x86_64-linux-gnu \
-DLD_LIBARY_PATH=${CONDA_PREFIX}/lib:/usr/lib/x86_64-linux-gnu \
確實,CMake 能夠找到它需要的庫,例如 CUDA、CuDNN、OpenBlas、FFMpeg 等。一段時間內一切似乎都很順利。
然而,在鏈接階段,CMake 不斷附加一個奇怪的庫參考“-llib”。lib 當然是一個不存在的庫。例如,一個這樣的命令是
cd /home/albert/app/src/opencv/build/modules/cudev && /usr/bin/cmake -E cmake_link_script CMakeFiles/opencv_cudev.dir/link.txt --verbose=1
/usr/bin/c -fPIC -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Winit -self -Wpointer-arith -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show -option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -Wno-undef -Wno-missing-declarations -Wno-unused-function -Wno-unused-variable -Wno-enum-compare -Wno-shadow -O3 -DNDEBUG -DNDEBUG -Wl,--exclude-libs,libippicv.a -Wl,--exclude-libs,libippiw .a -Wl,--gc-sections -Wl,--as-needed -shared -Wl,-soname,libopencv_cudev.so.4.4 -o ../../lib/libopencv_cudev.so.4.4.0 CMakeFiles/ opencv_cudev。dir/src/stub.cpp.o -L/usr/local/cuda/lib64 -L/home/albert/.conda/envs/denseflow -Wl,-rpath,/usr/local/cuda/lib64:/home/ albert/.conda/envs/denseflow::::::::::::::::::::::: -ldl -lm -lpthread -lrt ../../3rdparty/lib/libippiw .a ../../3rdparty/ippicv/ippicv_lnx/icv/lib/intel64/libippicv.a -lcudart_static -lpthread -ldl -lrt -lnppc -lnppial -lnppicc -lnppidei -lnppif -lnppig -lnppim -lnppist -lnppisu - lnppitc -lnpps -lcublas-llib -lcufft -L/usr/local/cuda/lib64 -L/usr/lib/x86_64-linux-gnu -L/home/albert/.conda/envs/denseflow -lcudart_static -lpthread -ldl -lrt -lnppc - lnppial -lnppicc -lnppidei -lnppif -lnppig -lnppim -lnppist -lnppisu -lnppitc -lnpps -lm -lpthread -lcublas -llib -lcufft
這會導致以下錯誤。
/usr/bin/ld: 找不到 -llib collect2: 錯誤: ld 回傳 1 退出狀態 make[2]: *** [modules/cudev/CMakeFiles/opencv_cudev.dir/build.make:89: lib/libopencv_cudev.so .4.4.0] 錯誤 1
如果我從 C 命令中手動洗掉“-llib”(兩次出現),該命令將成功執行。
這里發生了什么?
雖然我不熟悉 CMake,但感覺應該有一種直接的方法來阻止 CMake 這樣做。
非常感謝你的幫助。
Update: There does seem to be something wrong with the OpenCV CMake files. When I run CMake, one of its output is
-- Extra dependencies: dl m pthread rt cudart nppc nppial nppicc nppidei nppif nppig nppim nppist nppisu nppitc npps cublas lib cufft -L/usr/local/cuda-11.6/lib64 -L/home/albert/.conda/envs/denseflow
The mysterious lib already appears here.
Someone on the Internet suggests modifying CMakeCache.txt manually, but I wasn't able to get it to work. CMake just overwrites it after my modifications.
uj5u.com熱心網友回復:
該問題是由以下 CMake 選項引起的。
-DCUDNN_LIBRARY='/${CONDA_PREFIX}/lib'
洗掉此選項解決了問題。似乎該路徑應該指向檔案,而不是目錄。我不確定它應該指向 CUDA 11.6 和 CuDNN 8.3.2 的哪個檔案,但只需洗掉這一行就足夠了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/439887.html
