Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >链接静态库时的Cmake链接路径错误

链接静态库时的Cmake链接路径错误
EN

Stack Overflow用户
提问于 2020-04-14 04:39:27
回答 1查看 1.2K关注 0票数 2

我有一个cmake项目,它由我自己的静态库和可执行文件组成。简化的项目结构是:

最高级别的cmake:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        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"
    )

基本上,项目直接依赖的路径- tesseractopencv及其依赖项。

用于静态库的Cmake文件(teststaticlib/CMakeLists.txt):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
)

我在构建时会出现以下错误:

ninja: error:调试/mainproject/testexe.exe所需的'C:/tesseract41_x64-static/leptonica_x64-windows-static/debug/lib/gif.lib',,缺少并没有任何已知的规则来创建它

为什么我要得到这个错误,以及如何修复它?为什么cmake要在轻子文件夹中查找我的直接依赖项的子依赖项(在本例中,giftesseract of leptonica的依赖项),而它们的路径与LibsPath.cmake不同?我知道这不是tessleptonica特有的问题,因为如果我将这些库更改为其他库,模式就会保持不变,而且我仍然会得到相同的错误,但是使用其他库。所以我的cmake文件肯定出了什么问题,但是我不知道错误在哪里。

编辑:尝试更改我的库链接到PUBLIC并向exe添加相同的依赖项。即使尝试将子依赖项gif链接到exe -仍然会得到相同的错误。

teststaticlib/CMakeLists.txt:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
target_link_libraries(teststaticlib 
PUBLIC 
    ${Tesseract_LIBRARIES}
    ${OpenCV_LIBS}
)

testexe/CMakeLists.txt

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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
)
EN

回答 1

Stack Overflow用户

发布于 2020-04-17 19:02:23

以下是“用小工具掌握cmake”的引文,可能会有所帮助:

CMAKE_PREFIX_PATH:这指定了FIND_XXX()命令将使用的路径。它包含FIND_XXX()命令的“基本”目录,以便将适当的子目录附加到其中。FIND_PROGRAM()将/bin添加到路径中的每个目录;FIND_LIBRARY()将/lib附加到路径中的每个目录

因此,我通常只需编写某种类型的库导入脚本,并使用find_library()命令的路径/提示来指向正确的目录。据我所知,导入库目标的最健壮的方法是不按原样使用find_library(),而是使用cmake ()命令从该库生成导入脚本(如果可用的话)。参见find_library() 文档

另外,链接静态库也有点奇怪。它们会被编译,但是在生成最终的二进制文件之前,实际上没有任何东西被链接到它们。私有库意味着链接符号被密封在静态库中,并且依赖项不会被进一步传递。PUBLIC然后简单地将lib添加到LINK_INTERFACE_LIBRARIES/LINK_LIBRARIES目标属性中,然后将依赖项传递到生成最终的二进制文件。(共享库或可执行文件)

请注意,我有*nix背景,如果在windows上构建,我可能会得到很少的细节错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61207911

复制
相关文章
如何使用Duplicut对大型字典进行重复项剔除
现代密码字典在创建过程中通常会连接多个数据源,在理想情况下,最有可能成功的密码一般都位于字典列表的开头部分,这样才能够确保密码在最短的时间里被破解成功。
FB客服
2021/07/02
1.2K0
[Leetcode][python]删除排序数组中的重复项/删除排序数组中的重复项 II
数组完成排序后,我们可以放置两个指针 ii 和 jj,其中 ii 是慢指针,而 jj 是快指针。只要 nums[i] = nums[j]nums[i]=nums[j],我们就增加 jj 以跳过重复项。
蛮三刀酱
2019/03/26
6.5K0
php 去除数组重复项并且重新建立索引 转
$data = array(0=>'jquery',1=>'php',2=>'ajax',3=>'jquery',4=>'linux',5=>'php');  $data = array_values(array_unique($data));  print_r($data);
双面人
2019/04/10
1.3K0
JS判断重复数组是否有重复项
大家好,今天我们来讲一下,如何使用javascript判断一个数组之中,是否有相同重复的元素。 在讲之前,先来讲一下思路: 在现实当中,当我们要判断某几个东西是否相同,那就意味着这东西至少是有2个或
web前端教室
2018/02/06
7.4K0
JS判断重复数组是否有重复项
删除排序数组中的重复项
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
木瓜煲鸡脚
2020/09/23
5K0
<leetcode刷题-数组>删除排序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
哆哆jarvis
2022/08/23
4.4K0
[LEETCODE]从排序数组中删除重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
用户2353021
2020/05/11
6.3K0
删除排序数组中的重复项
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
_kyle
2020/11/03
4.5K0
删除有序数组中的重复项
要求删除重复元素,实际上就是将不重复的元素移到数组的左侧,即慢指针p的右边都是不重复的元素,p—q之间是出现重复的元素。
大忽悠爱学习
2021/03/27
4.7K0
删除有序数组中的重复项
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
狼啸风云
2023/10/07
2140
删除有序数组中的重复项 II
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
狼啸风云
2023/10/07
2040
LeetCode | 删除有序数组中的重复项
题目 删除有序数组中的重复项 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。 将最终结果插入 nums 的前 k 个位置后返回 k 。 不要使用额外的空间,你必须在 原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。 判题标准: 系统会用下面的代码来测试你的题解:
yiyun
2023/03/08
3.9K0
LeetCode | 删除有序数组中的重复项
[leetcode数组系列]3 删除排序数组中的重复项
1 leetcode原文链接 https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ 示例1
我是程序员小贱
2020/06/05
4.2K0
Access重复项查询
大家好上节介绍了汇总查询,继续介绍选择查询中的重复项查询和不匹配项查询,这两种查询都可以在查询向导中创建,本节主要介绍重复项查询。
无言之月
2020/06/02
1.8K0
Access重复项查询
LeetCode - 删除排序数组中的重复项
LeetCode第26题,难度简单。这题题目也是相当的长,所以只取了题目的主干,示例和说明请点击下方链接查看详情。
晓痴
2019/08/22
4.1K0
LeetCode - 删除排序数组中的重复项
python 使用pandas 去除csv重复项
subset : column label or sequence of labels, optional 用来指定特定的列,默认所有列 keep : {‘first’, ‘last’, False}, default ‘first’ 删除重复项并保留第一次出现的项 inplace : boolean, default False 是直接在原来数据上修改还是保留一个副本
kirin
2021/04/19
5.5K0
python 使用pandas 去除csv重复项
26. 删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
张伦聪zhangluncong
2022/10/26
2.4K0
26. 删除有序数组中的重复项
一 题目: 二 思路: 比对法,每次找到一个和咱们要设置位置不一样的值 记录当前正在设置值(需要被比较的值)的位置,只要后面的元素和他一样那就跳过 直到找到下一个和它不一样的数字放在下一个位置,然后继续比对 三:代码: class Solution { public int removeDuplicates(int[] nums) { int len = nums.length; if (len <=1){ return len;
名字是乱打的
2022/05/13
3.5K0
26. 删除有序数组中的重复项
Swift 从排序数组中删除重复项 - LeetCode
给定一个有序数组,你需要原地删除其中的重复内容,使每个元素只出现一次,并返回新的长度。
韦弦zhy
2018/09/11
5.2K0
LeetCode 26:删除有序数组中的重复项
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
五分钟学算法
2023/01/10
3.3K0
LeetCode 26:删除有序数组中的重复项

相似问题

将ids ->项转换为{id} ->项

11

将列表中的重复项转换为唯一项

33

将文件转换为包含重复项的字典

20

将数组中的重复项转换为唯一项,而不删除Javascript中的任何项

12

获取重复项的和作为IDS的数组

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文