关于CMake生成包含PCL库和CGAL库的工程时出现“无法解析的外部符号”的错误

2023-11-04

前言

博主之前安装了PCL 1.8.0库(教程链接:PCL-1.8.0-AllInOne VS2013 Win8 X64 安装配置及部分问题解决方法)和CGAL库(教程链接:在Win8,VS2013中配置CGAL库),最近需要把两个库用在同一个工程,所以用CMake-gui来生成包含这两个库的VS2013工程。结果出现“无法解析的外部符号”的错误。

在经历了10个小时左右的资料搜索、询问求助之后,该问题还是没有得到根本解决,但是采取了一种“软着陆”的解决方案,程序能够运行了。

先记录博主的报错现象以及排错过程,一是可以给遇到相同情况的朋友些许借鉴,二是为自己日后填坑做前景记录。


环境

Win 8-4

VS 2013

CMake 3.10.2-x64

PCL 1.8.0-x64

CGAL 4.10.2-x64


问题

  • 利用CMake-gui生成只包含PCL库的工程——运行正常。
cmake_minimum_required(VERSION 3.0.0)

project(ISS_RoPS)

# PCL 1.8.0
find_package(PCL 1.8.0 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable(ISS_RoPS test.cpp)
target_link_libraries(ISS_RoPS ${PCL_LIBRARIES})
  • 利用CMake-gui生成只包含CGAL库的工程——运行正常。
# 仿照CGAL/demo的CMakeLists.txt  
cmake_minimum_required(VERSION 3.0.0) 

project(ISS_RoPS)  
  
# CGAL 4.10.2   
find_package(CGAL QUIET)  
  
if ( CGAL_FOUND )  
  
  include( ${CGAL_USE_FILE} )  
  
  include( CGAL_CreateSingleSourceCGALProgram )  
    
  message(STATUS "Find CGAL successfully.")  
  
else()  
    
    message(STATUS "This program requires the CGAL library, and will not be compiled.")  
    
endif()  
  
add_executable(ISS_RoPS test.cpp)  
  
target_link_libraries(ISS_RoPS ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES}) 

# 仿照CGAL/example的CMakeLists.txt

project( ISS_RoPS )

cmake_minimum_required(VERSION 3.0.0)

find_package(CGAL QUIET)

if ( CGAL_FOUND )

  include( ${CGAL_USE_FILE} )

  include( CGAL_CreateSingleSourceCGALProgram )

  include_directories (BEFORE "../../include")

  # create a target per cppfile
  file(GLOB cppfiles RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
  foreach(cppfile ${cppfiles})
    create_single_source_cgal_program( "${cppfile}" )
  endforeach()

else()
  
    message(STATUS "This program requires the CGAL library, and will not be compiled.")
  
endif()
  • 利用CMake-gui生成包含PCL和CGAL库的工程——报错:“无法解析的外部符号”
make_minimum_required(VERSION 3.0.0)

project(ISS_RoPS)

# PCL 1.8.0
find_package(PCL 1.8.0 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

# CGAL 4.10.2 
find_package(CGAL QUIET)

if ( CGAL_FOUND )

  include( ${CGAL_USE_FILE} )

  include( CGAL_CreateSingleSourceCGALProgram )
  
  message(STATUS "Find CGAL successfully.")

else()
  
    message(STATUS "This program requires the CGAL library, and will not be compiled.")
  
endif()

add_executable(ISS_RoPS test.cpp)
target_link_libraries(ISS_RoPS ${PCL_LIBRARIES})
#target_link_libraries(ISS_RoPS ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES})


(看错误提示,貌似是两个库依赖的Boost库冲突或者Boost库的lib配置不完整导致的)


排错过程

1.Boost库在CMakeLists.txt中单独添加的相关测试。

(1)原版的测试:Boost库可以找到,但是Boost_LIBRARY_DIRS和Boost_LIBRAIRES不输出。程序依然报错。

cmake_minimum_required(VERSION 3.0.0)  
  
project(ISS_RoPS) 

# PCL 1.8.0  
find_package(PCL 1.8.0 REQUIRED)  
  
include_directories(${PCL_INCLUDE_DIRS})  
link_directories(${PCL_LIBRARY_DIRS})  
add_definitions(${PCL_DEFINITIONS})  
  
# CGAL 4.10.2   
find_package(CGAL QUIET)  
  
if ( CGAL_FOUND )  
  
  include( ${CGAL_USE_FILE} )  
  
  include( CGAL_CreateSingleSourceCGALProgram )  
    
  message(STATUS "Find CGAL successfully.")  
  
else()  
    
    message(STATUS "This program requires the CGAL library, and will not be compiled.")  
    
endif()  
  
# BOOST 1.59.0  
find_package(Boost 1.59.0 REQUIRED)  
include_directories(${Boost_INCLUDE_DIRS})  
link_directories(${Boost_LIBRARY_DIRS})  
add_definitions(${PCL_DEFINITIONS})  

# 此处可以输出“Boost_INCLUDE_DIRS”,但不输出“Boost_LIBRARY_DIRS”和“Boost_LIBRARIES”  
message(STATUS "${Boost_INCLUDE_DIRS}:" ${Boost_INCLUDE_DIRS})  
  
message(STATUS "${Boost_LIBRARY_DIRS}:" ${Boost_LIBRARY_DIRS})  
  
message(STATUS "${Boost_LIBRARIES}: " ${Boost_LIBRARIES})  

# 显示成功找到Boost  
if( Boost_FOUND )
message(STATUS "Find Boost successfully.")  
else()  
    message(STATUS "This program requires the Boost library, and will not be compiled.")  
endif()  
  
add_executable(ISS_RoPS test.cpp)  
target_link_libraries(ISS_RoPS ${PCL_LIBRARIES})  
target_link_libraries(ISS_RoPS ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES})  
target_link_libraries(ISS_RoPS ${Boost_LIBRARIES})

(2)手动set设置Boost_LIBRARY_DIRS和Boost_LIBRARIES的路径:

1)变量输出,但程序generate报错:Boost_LIBRARIES应该对应的是链接库文件,不是路径;

2)去掉Boost_LIBRARIES的路径set后Boost_LIBRARY_DIRS变量输出,但Boost_LIBRARIES路径不输出。

3)程序依然报错。

[变量名的差异以及根据什么目的对谁进行设置set,如何设置,多参考CMake的FindBoost.cmake]

cmake_minimum_required(VERSION 3.0.0)  
  
project(ISS_RoPS)  
  
# PCL 1.8.0  
find_package(PCL 1.8.0 REQUIRED)  
  
include_directories(${PCL_INCLUDE_DIRS})  
link_directories(${PCL_LIBRARY_DIRS})  
add_definitions(${PCL_DEFINITIONS})  
  
# CGAL 4.10.2   
find_package(CGAL QUIET)  
  
if ( CGAL_FOUND )  
  
  include( ${CGAL_USE_FILE} )  
  
  include( CGAL_CreateSingleSourceCGALProgram )  
    
  message(STATUS "Find CGAL successfully.")  
  
else()  
    
    message(STATUS "This program requires the CGAL library, and will not be compiled.")  
    
endif()  
  
#BOOST 1.59.0  
find_package(Boost 1.59.0 REQUIRED)  
set(Boost_LIBRARY_DIRS "C:/dev/boost_1_59_0/lib64-msvc-12.0")  
#set(Boost_LIBRARIES "C:/dev/boost_1_59_0/lib64-msvc-12.0")  
include_directories(${Boost_INCLUDE_DIRS}})  
link_directories(${Boost_LIBRARY_DIRS})  
  
if( Boost_FOUND )  
    message(STATUS "Find Boost successfully.")  
else()  
    message(STATUS "This program requires the Boost library, and will not be compiled.")  
endif()  
  
message(STATUS "${Boost_INCLUDE_DIRS}:" ${Boost_INCLUDE_DIRS})  
  
message(STATUS "${Boost_LIBRARY_DIRS}:" ${Boost_LIBRARY_DIRS})  
  
message(STATUS "${Boost_LIBRARIES}: " ${Boost_LIBRARIES})  
  
if( Boost_FOUND )  
    message(STATUS "Find Boost successfully.")  
else()  
    message(STATUS "This program requires the Boost library, and will not be compiled.")  
endif()  
  
message(STATUS "Boost_INCLUDE_DIRS:" ${Boost_INCLUDE_DIRS})  
message(STATUS "Boost_LIBRARY_DIRS:" ${Boost_LIBRARY_DIRS}) 
message(STATUS "Boost_LIBRARIES" ${Boost_LIBRARIES})  

add_executable(ISS_RoPS test.cpp)  
target_link_libraries(ISS_RoPS ${PCL_LIBRARIES})  
target_link_libraries(ISS_RoPS ${Boost_LIBRARIES})


2.PCL库包含过程中Boost库的检查:boost输出正确。

cmake_minimum_required(VERSION 3.0.0)

project(ISS_RoPS)

FIND_PACKAGE(PCL REQUIRED)
INCLUDE_DIRECTORIES(${PCL_INCLUDE_DIRS})
ADD_DEFINITIONS(${PCL_DEFINITIONS})

add_executable(ISS_RoPS pointTransform.cpp)
target_link_libraries(ISS_RoPS ${Boost_LIBRARIES})

message(STATUS "Boost_INCLUDE_DIRS:" ${Boost_INCLUDE_DIRS})
message(STATUS "Boost_LIBRARY_DIRS:" ${Boost_LIBRARY_DIRS})
message(STATUS "Boost_LIBRARIES" ${Boost_LIBRARIES})


解决方案

1.CMake整合源文件生成包含PCL库的VS2013工程然后在工程中加入CGAL库的配置文件。

——失败:无法解析的外部符号。

2.CMake整合源文件生成一个不包含库的VS2013工程然后在工程中加入CGAL库的配置文件。

——失败:无法解析的外部符号。

3.VS2013新建一个空项目,添入相应源文件,再加入CGAL库的配置文件。

——成功。

4.VS2013新建一个空项目,添入相应源文件,再加入CGAL库的配置文件以及PCL库分别的Debug版本配置文件和Release版本配置文件。(本质:把利用CMake生成工程的方式变成利用VS2013生成新的空工程然后把源文件和两个库的对应配置文件导进来的方式)

——Debug和Release下都成功运行。


解决方案具体过程

1.在VS2013中新建空项目并进行活动平台修改。


注意VS2013中配置管理器(Configuration Manager)默认活动平台(Active Solution plantform)是win32,如果安装的是x64的PCL,需要将其改成x64,否则编译的时候会出现奇怪的问题。


修改方法如下

打开“解决方案资源管理器”视图 -> 右键目标项目("PCLTest"为例) -> 选择“属性”,进入程序属性页 -> 点击“配置管理器” -> 下拉“平台”按钮,点击“新建” -> 新建平台“x64”,从此处复制设置选“空”,创建新的解决方案平台打钩 -> 完成。



2.项目属性表的建立

其中Debug模式下加CGAL的配置文件和PCL的Debug版本配置文件,Realese版本下加CGAL的配置文件和PCL的Release配置文件。(配置文件生成一次后保存好,后面可以直接添加利用)

(1)PCL项目属性表的建立(Debug版本和Release版本只是链接器输入的依赖项不同,其余设置一致)

切换到“属性管理器”视图,解决方案资源管理器(Prop

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于CMake生成包含PCL库和CGAL库的工程时出现“无法解析的外部符号”的错误 的相关文章

  • cmake 发现错误的 python 库

    我是 CMake 新手 无法理解一些使用概念 我正在从 C 程序调用 python 脚本 include
  • CMake 未添加 ASM_MASM 的预处理器定义

    在使用以下 cmake 生成的构建系统 Visual Studio 2017 Generator 中 test asm 源文件不是使用预处理器定义 MY MASM DEFINITION 进行编译的 cmake minimum require
  • 使用 CMake 链接 .s 文件

    我有一个我想使用的 c 函数 但它是用Intel编译器而不是gnu C编译器 我在用着cmake构建程序 我实际上正在使用ROS因此rosmake但基础是cmake所以我认为这更多是一个 cmake 问题而不是ROS问题 假设使用构建的文件
  • 使用 cmake 构建项目后如何运行 ctest

    我希望每次成功构建项目时都启动测试 如果某些测试被破坏 我希望我的构建也被破坏 默认情况下 我需要通过运行来手动运行测试ctest命令 CTest 实际上可以构建项目 但我使用调用的 IDEmake建立资源 和make不运行测试 我将此命令
  • 无法安装 R 包:CMake 错误

    我正在尝试安装factoextra 但我在 CMake 部分遇到了困难 特别是出现如下错误 CMake Error The source directory tmp does not exist 当我尝试安装其依赖项时也是如此 nloptr
  • CMake 错误:无法创建命名生成器 Visual Studio 15 2017 Win64-T

    我想建立这个项目 https github com xmrig xmrig https github com xmrig xmrig根据此处的说明 https github com xmrig xmrig wiki Windows Buil
  • CMake错误:本项目中使用了以下变量,但它们被设置为NOTFOUND

    我正在尝试配置whalebot带有 tar 文件的爬虫whalebot 0 02 00 tar gz 我已正确提取它 root Admin1 dls tar xvzf whalebot 0 02 00 tar gz 之后我想对其进行配置 r
  • cmake 在执行其他操作之前执行进程

    我在执行其他操作之前 CMake 执行进程时遇到问题 下面的代码片段显示了这种情况 if NOT EXISTS CMAKE CURRENT BINARY DIR generated file MAKE DIRECTORY CMAKE CUR
  • 使用 OpenCL 支持构建 OpenCV

    在 CMake 中 我使用 OpenCL Enable ON 构建了 OpenCV 它自动检测到OPENCL INCLUDE DIR路径但是OPENCL LIBRARY即使单击配置后也是空的 为了OPENCL LIBRARY我也没有看到浏览
  • grpc找不到protobuf库

    我检查了 grpc 安装并完成了构建和安装 现在当我尝试 find package gRPC CONFIG REQUIRED I get CMake Error at CMakeLists txt 15 find package Found
  • 如何在 Windows 中使用 cmake 更轻松地链接 gtk 库?

    我现在通过手动包含所有必需的路径 gtk包位于D Tools gtk bundle 2 20 0 20100406 win32 include directories D Tools gtk bundle 2 20 0 20100406 w
  • 如何让 CMake 为目标安装 PDB 文件

    如何让 CMake 安装调试 Visual Studio 生成的 DLL 文件和 EXE 文件所需的配套 PDB 文件 我已经挣扎了一段时间 试图找到这个问题的一个好的答案 我现在认为我找到了一个 使用安装文件命令
  • libSDL、CMake 和 Mac OS X Lion

    我正在尝试在我的Mac上编译cmake项目 但它取决于SDL框架 我安装了这个框架 在 cmake 之后向我报告找不到 libSDL 我自己设置了以下导出变量 按照 cmake 的建议 export SDL INCLUDE DIR Libr
  • 在 Android Studio 中使用预构建的共享库

    我需要在我的 android 项目中使用自定义的预构建共享库 在独立 ndk 上构建为 libdynamic so 我在路径 src main 中创建了一个文件夹 jniLibs 然后在其中创建了 4 个文件夹 即 armeabi arme
  • target_link_libraries 和 INCLUDE_DIRECTORIES 属性

    在这个片段中 cmake minimum required VERSION 3 0 project hello LANGUAGES C VERSION 0 0 1 add library a INTERFACE target include
  • CMake Xcode生成器创建了一个无法构建的项目

    我有一个使用 CMake 构建系统的 C 项目 我使用 MacBook Pro 进行开发 因此当我使用终端时 一切都非常顺利 我可以构建我的项目 然而 今天我发现我可以在使用 CMake 生成器创建相应的项目后使用 Xcode gt cma
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再
  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • 配置:错误:找不到 CGAL 库

    我的最终目标就是获取python包graph tool在我的系统上工作 如果可能的话 也在 ipynb 上工作 我已经brew install graph tool 如此处所示 https git skewed de count0 grap
  • 使用 cmake 处理头文件依赖关系

    我正在一个小型 C 项目上使用 CMake 到目前为止 它运行得很好 有一点点 x 当我更改头文件时 通常需要重新编译许多源文件 直接或间接包含它的文件 但是 cmake 似乎只检测到some的源文件被重新编译 导致损坏状态 我可以通过清除

随机推荐

  • 查看某个端口的连接数情况

    windows指令 查看信息 netstat aon findstr 9200 find ESTABLISHED 查看连接数 netstat aon findstr 9200 find ESTABLISHED c linux 查看信息 ne
  • webpack 学习(一)前端常用的模块化设计模式之commonJs

    前端常用模块化规范 commonJs 规范 AMD ES6 Module规范 commonJs 和AMD 的区别 commonJs加载模块是同步的 也就是说只有加载完成的才会执行后面的操作 由于Node主要用于服务器编程 模块文件一般都存在
  • 深入 AXI4 总线(二)架构

    五个独立通道 AXI4 总线的一大特征是它有 5 个独立的传输通道 这些通道都只支持单向传输 作为类比 SPI 总线有 2 条传输通道 MISO MOSI SPI 输入输出的数据 大路朝天 各走一条 而作为对比 IIC 协议则只有 SDA
  • 类EMD的“信号分解方法”及MATLAB实现(第三篇)——CEEMDAN

    来帮忙填坑了 今天接着之前讲过的EEMD和CEEMD 来介绍一下 类EMD 分解方法的第三篇 1 CEEMDAN 自适应噪声完备集合经验模态分解 的概念 CEEMDAN 1 Complete Ensemble Empirical Mode
  • 框架(Framework)

    框架 Framework 框架 Framework 是整个或部分系统的可重用设计 表现为一组抽象构件及构件实例间交互的方法 另一种定义认为 框架是可被应用开发者定制的应用骨架 前者是从应用方面而后者是从目的方面给出的定义 可以说 一个框架是
  • python grid函数_Python – matplotlib griddata的多处理器

    我在Python 3 4 2中运行了示例代码 具有numpy版本1 9 1和matplotlib版本1 4 2 在具有4个物理CPU的Macbook Pro上 即 与 虚拟 CPU相反 Mac硬件架构也是提供一些用例 import nump
  • 华为云存储空间图库占比太大_华为手机中常见的问题以及解决方法

    现在越来越多的人在用华为手机了 今天本文就总结了一些华为手机在使用中出现的一些问题 以及解决方法 希望能对你有所帮助 手机系统自带的播放器能否显示音乐的信息 华为手机中的音乐播放器是支持显示本地音乐文件的大小 音乐文件存储路径 歌手名称 专
  • Java连接GreenPlum

    1 postgres驱动 下载 https jdbc postgresql org download html 我下载的是 postgresql 42 2 4 jar URL String url jdbc postgresql host
  • 一种数据驱动的自动驾驶汽车前馈补偿器优化方法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 一个可靠的控制器对于自动驾驶汽车的安全和平
  • Vue Excel文件的下载和上传(formData)

    Vue Excel文件的下载和上传 formData 在本文中传给后台的数据为FormData 首先介绍Excel文件的上传和下载代码 HTML代码 其中引用了Element UI的button
  • 人工智能——衣服分类(大作业必备)

    官方网站 大作业系列传送门 文本分类 模仿VGG16的衣服分类 导入数据 指定名称 观察里面图片 预处理 建立模型 编译模型 开始训练 绘制曲线 模型评估 图形测试定义 验证结果 预测多张结果 预测单张结果 导入数据 tf keras da
  • laravel-admin整合wangEditor2及上传图片

    小伙伴说MD编辑器不好用 因为复制粘贴不方便 所以我换了一个编辑器整合 选择了老朋友wangEditor 下面为大家介绍怎么在laravel v6 9 laravel admin v1 7 wangEditor2的情况下上传图片 第一步 c
  • android sdk配置图文教程

    首先配置 java sdk 下载java sdk java sdk也有很多版本 问清项目版本 下载相对应的 然后配置环境变量 下图是我电脑下载的版本 下载好就就是配置环境变量了 配置java sdk 环境变量 右击我的电脑 属性 高级系统设
  • VUE element-ui 之table表格导出Excel功能封装(纯前端实现)

    需求 导出当前页面所有数据 步骤 下载所需依赖 npm install save xlsx file saver 引入依赖 这里我进行了封装 由于很多页面都需要导出excel功能 js文件中引入依赖 进行导出方法封装 import File
  • 简单的jsp+servlet+jdbc+mysql实现用户增删改查-一抹茶-csdn

    jsp servlet jdbc mysql实现用户增删改查 项目下载地址 里面包含了项目文件 jar bootstrap jquery sql 也可以联系957406675 QQ群获取下载 运行环境 jdk1 8 0 102 eclips
  • 操作系统课程设计 - 多线程模拟 - 时间片轮转法实现处理机调度

    此篇博客用于记录学习历程 仅供交流参考 一 课程设计题目及内容 题目 设计一个按照时间片轮转法实现处理机调度的程序 时间片轮转法实现处理机调度的程序设计提示如下 1 假设系统有n个进程 每个进程用一个进程控制块 PCB 来代表 进程控制块的
  • 如何使用css将多出范围的字变为...

    话不多说 上代码 呈一行效果 width 100px text overflow ellipsis 将文本溢出显示为 white space nowrap 强制显示为一行 overflow hidden 溢出隐藏 呈多行效果 width 1
  • Golang开发项目目录简介以及目录结构设置规范

    一 Golang项目简单介绍 Golang简单的目录结构如下 其中 bin用来存放经过go bulid后的可执行文件 pkg存放编译后的go module 而src就存放我们项目的代码 二 三种常用目录结构 1 适合个人开发者 2 流行的目
  • 大数据组件-kafka(基础篇)

    大数据组件 kafka 基础篇 Kafka简介 Kafka是什么 Kafka的应用场景 Kafka的架构组成 Kafka的主要竞争力 Kafka简介 Kafka是什么 Kafka是一个消息队列 存储消息的队列中间件 可以存储消息进队列中 也
  • 关于CMake生成包含PCL库和CGAL库的工程时出现“无法解析的外部符号”的错误

    前言 博主之前安装了PCL 1 8 0库 教程链接 PCL 1 8 0 AllInOne VS2013 Win8 X64 安装配置及部分问题解决方法 和CGAL库 教程链接 在Win8 VS2013中配置CGAL库 最近需要把两个库用在同一