提问人:Pedro 提问时间:10/25/2023 最后编辑:Christoph RackwitzPedro 更新时间:10/26/2023 访问量:52
无法使用 CMake 静态链接到 OpenCV 4.7.0
Failing to statically link to OpenCV 4.7.0 using CMake
问:
我使用.我查看了输出,它似乎正确地生成了静态库(就像我在 Windows 上一样)。BUILD_SHARED_LIBS=OFF
.lib
但是,当我尝试使用 CMake 的机制链接到生成的文件时,它似乎告诉链接器寻找动态库,并且出现错误。find_package
LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease'
以下是重现该问题的最低限度示例。
- 下载 OpenCV 4.7.0 并在 Windows 上使用以下命令进行构建:
cmake -S .\sources\ -B opencv-build-test -D BUILD_SHARED_LIBS=OFF
cmake --build .\opencv-build-test\
凌晨 1 点创建以下项目:
cmake_minimum_required(VERSION 3.26)
project(OpenCVStaticLinkingTest)
set(CMAKE_CXX_STANDARD 17)
find_package(OpenCV 4.7.0 REQUIRED EXACT)
add_executable(OpenCVStaticLinkingTest main.cpp)
target_link_libraries(OpenCVStaticLinkingTest ${OpenCV_LIBS})
2乙.使用此主文件:
#include <iostream>
#include <opencv2/opencv.hpp>
int main() {
// Create an OpenCV matrix
cv::Mat testMatrix(5, 5, CV_32F);
// Interact with it to show we've gone this far
std::cout << "Value 1,1: " + std::to_string(testMatrix.at<float>(1,1)) << std::endl;
return 0;
}
- 然后按如下方式构建:
cmake -S . -B example-build -D OpenCV_DIR=$WHEREVER_YOU_BUILT_IT
cmake --build example-build
我正在使用 VS 17 在 Windows 11 上进行编译,并且尝试了使用和不使用 Ninja。
网上的一切似乎都告诉我,编译应该是我需要做的,但显然有些不对劲。我试过:BUILD_SHARED_LIBS=OFF
- 在有标志和没有标志的情况下进行编译
OPENCV_GENERATE_PKGCONFIG=YES
- 设置为“在我的项目上”
OpenCV_STATIC
- 设置为“在我的项目上”
OpenCV_SHARED
- 以上两者一起
- 设置
set(CMAKE_SHARED_LINKER_FLAGS "-static")
- 设置
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
但到目前为止,总是遇到同样的问题。
答: 暂无答案
评论
BUILD_SHARED_LIBS=OFF
并不意味着使用静态运行时。这意味着创建静态库而不是动态/共享库。BUILD_WITH_STATIC_CRT
-DBUILD_SHARED_LIBS=OFF -DBUILD_WITH_STATIC_CRT=OFF
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded
BUILD_WITH_STATIC_CRT
BUILD_WITH_STATIC_CRT
ON
LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease'