我有一个cmake项目,其中包含我自己的静态库和可执行文件。简化的项目结构为:
顶级cmake:
cmake_minimum_required(VERSION 3.16)
project(mainproject
VERSION 0.0.1
DESCRIPTION ""
LANGUAGES CXX
)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
#include libs
include(LibsPath)
add_subdirectory(teststaticlib)
add_subdirectory(testexe)
cmake / LibsPath.cmake:
set(CMAKE_PREFIX_PATH
"C:/tesseract41_x64-static/leptonica_x64-windows-static"
"C:/tesseract41_x64-static/tiff_x64-windows-static"
"C:/tesseract41_x64-static/tesseract_x64-windows-static"
"C:/tesseract41_x64-static/libpng_x64-windows-static"
"C:/tesseract41_x64-static/libjpeg-turbo_x64-windows-static"
"C:/tesseract41_x64-static/giflib_x64-windows-static"
"C:/tesseract41_x64-static/libwebp_x64-windows-static"
"C:/opencv4_x64-windows-static"
"C:/protobuf_x64-windows-static"
"C:/hdf5_x64-windows-static"
"C:/szip_x64-windows-static"
)
基本上是项目直接依赖项的路径-tesseract
和opencv
及其依赖项。
静态库的Cmake文件(teststaticlib / CMakeLists.txt):
cmake_minimum_required(VERSION 3.16)
project(teststaticlib)
set(CMAKE_GENERATOR "Ninja")
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
#enable unicode
add_definitions(-DUNICODE -D_UNICODE)
set(SOURCE_FILES
#...source files
)
set(PRIVATE_HEADER_FILES
#... header files
)
set(PUBLIC_HEADER_FILES
#... header files
)
add_library(teststaticlib STATIC ${SOURCE_FILES} ${PRIVATE_HEADER_FILES} ${PUBLIC_HEADER_FILES})
add_library(teststaticlib::teststaticlib ALIAS teststaticlib)
set_target_properties(teststaticlib PROPERTIES OUTPUT_NAME teststaticlib)
target_include_directories(teststaticlib
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
)
#precompiled headers
target_precompile_headers(teststaticlib PRIVATE src/pch.h)
#link libs
find_package(tesseract CONFIG REQUIRED)
find_package(opencv CONFIG REQUIRED core imgproc highgui)
include_directories(${Tesseract_INCLUDE_DIRS})
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(teststaticlib
PRIVATE
${Tesseract_LIBRARIES}
${OpenCV_LIBS}
)
到目前为止,一切正常。 teststaticlib.lib
正常运行,没有任何错误。但是,一旦我将任何可执行文件添加到项目中,并将teststaticlib
链接到它:
testexe / CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(testexe)
set(SOURCE_FILES
main.cpp
)
add_executable(testexe ${SOURCE_FILES})
target_link_libraries(testexe
PRIVATE
teststaticlib::teststaticlib
)
构建时出现此错误:
忍者:错误:'C:/tesseract41_x64-static/leptonica_x64-windows-static/debug/lib/gif.lib','debug / mainproject / testexe.exe'所需,缺少它,并且没有已知规则可以使它运行] >
为什么会出现此错误,以及如何解决?当您从
gif
中看到路径不同时,为什么cmake在leptonica文件夹内寻找我直接依赖的子依赖(在这种情况下,tesseract
是leptonica
的LibsPath.cmake
的依赖)?我知道这不是tess
或leptonica
特定的问题,因为如果我将这些库更改为其他任何库,则模式仍然存在,并且其他库仍会出现相同的错误。因此,我的cmake文件中肯定有问题,但是我无法弄清楚错误在哪里。
编辑:试图更改我的库链接到PUBLIC
,并向exe添加相同的依赖项。即使尝试将子依赖项gif
链接到exe-仍然会收到相同的错误。
teststaticlib / CMakeLists.txt:
target_link_libraries(teststaticlib PUBLIC ${Tesseract_LIBRARIES} ${OpenCV_LIBS} )
testexe / CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(testexe)
set(SOURCE_FILES
main.cpp
)
add_executable(testexe ${SOURCE_FILES})
find_package(tesseract CONFIG REQUIRED)
find_package(opencv CONFIG REQUIRED core imgproc highgui)
find_package(gif REQUIRED)
include_directories(${Tesseract_INCLUDE_DIRS})
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${GIF_INCLUDE_DIRS})
target_link_libraries(testexe
PRIVATE
${GIF_LIBRARIES}
${Tesseract_LIBRARIES}
${OpenCV_LIBS}
basicemul::basicemul
)
我有一个cmake项目,其中包含我自己的静态库和可执行文件。简化的项目结构为:顶级cmake:cmake_minimum_required(VERSION 3.16)project(mainproject ...
以下内容可能会有所帮助,引自“通过kitware掌握cmake”: