我该如何正确链接PCL库用于在Xcode编译Objective-C的应用中?(How do I li

2019-09-01 14:55发布

问:我如何在一个Objective-C可可(OSX,iOS的不)应用的上下文中使用PCL?

撕裂了我的头发在这个one.I不能得到libpcl与在Xcode我的目标C项目正常链接。 我已经检查并重新检查所有我能这么想的。 可能做一些愚蠢的,但我很为难。

实际的错误是链接:

Undefined symbols for architecture x86_64:
"pcl::PassThrough<pcl::PointXYZ>::applyFilterIndices(std::__1::vector<int, std::__1::allocator<int> >&)", referenced from:
 pcl::PassThrough<pcl::PointXYZ>::applyFilter(std::__1::vector<int, std::__1::allocator<int> >&) in PCLProcess.o
 ld: symbol(s) not found for architecture x86_64
  • 我试图编译的代码是可用的标准教程代码在这里: http://pointclouds.org/documentation/tutorials/passthrough.php#passthrough

  • 我可以得到它没有工作的Xcode(使用cmake和命令行编译究竟在本教程)

  • 我可以创建一个“命令行”项目并编译和使用Xcode的链接一次性CPP文件

  • 问题是相同的,无论我试着什么版本的PCL的。 MacPorts的,二进制发行版,自编1.6和躯干。 所有相同的结果。

  • 我已经尝试了几种不同的机器,OSX 10.7和10.8,同样的问题在两个。

  • 我甚至运行处对dylib核实失踪符号在我链接库(在这种情况下,过滤器)

任何想法非常赞赏,我已经失去了一个星期半到这一点。

见这个截图进行了详细的错误信息。

这是有问题的代码:

//PCLProcess.h
#import <Foundation/Foundation.h>
@interface PCLProcess : NSObject
@end

//PCLProcess.mm
#import "PCLProcess.h"
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>

@implementation PCLProcess

-(void)tryThis{
   // Code cut and pasted from tutoral (see link above)
}

@end

更新

这是一个更线索。 我在我头上相对于编译器/链接以及它们如何工作,但现在我想我知道发生了什么,但不是为什么(或如何解决它)。

  • 我手动运行该连接器工具,绝望的我开始在废弃的旗帜插上只是为了看看有什么结果。 以前的错误(以上)识别丢失的符号为 “×” PCL ::直通:: applyFilterIndices(STD :: __ 1 ::矢量>&)”,但LD -y给我这样的:

    LD:警告:选项-y是过时的,被忽略的建筑x86_64的未定义符号:找不到架构x86_64的符号(S):“__ ZN3pcl11PassThroughINS_8PointXYZEE18applyFilterIndicesERNSt3__16vectorIiNS3_9allocatorIiEEEE”,从引用:__ ZN3pcl11PassThroughINS_8PointXYZEE11applyFilterERNSt3__16vectorIiNS3_9allocatorIiEEEE在PCLProcess.o LD

于是我去寻找那象征,果然,它缺少(或不同):

nm /opt/local/lib/libpcl_filters.dylib | grep __ZN3pcl11PassThroughINS_8PointXYZEE18applyFilterIndices
00000000000a0fa0 
T  __ZN3pcl11PassThroughINS_8PointXYZEE18applyFilterIndicesERSt6vectorIiSaIiEE

我怀疑名字改编? 但同样,我真的不知道我在说什么关于在此时或者(更重要的),如何解决它。

Answer 1:

简短的回答:

在“构建选项”两个构建设置:

C ++语言方言:GNU ++ 98 [-std = GNU ++ 98]

C ++标准库:++的libstdc(GNU C ++标准库)

该第二设定(C ++标准库)是关键的一条; 使用的libc ++会产生上述的问题中所示的“未定义的符号”链接错误。

任何人试图这方面的细节:

这适用于Xcode的4.62,llvm4.2,libpcl 1.7(目前dev的,我从主干编译)并提高1.53。 一路上我遇到了与升压和可可涉及使用零的已知问题的方式(请参阅此链接: https://svn.boost.org/trac/boost/ticket/5010 ),也有一些陌生感与升压特性(见这样的: C ++:升压1.48型性状和可可夹杂古怪 )因此我结束了包括PCL头如下:

#define nil Boost_nil
#define Nil Boost_Nil
#ifdef check
#undef check
#endif

#include <pcl/pcl_base.h>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>

#undef Nil
#undef nil


文章来源: How do I link PCL library properly for use within an objective-C app compiled in Xcode?