2

问题:如何在 Objective-C Cocoa(OSX,而​​不是 iOS)应用程序的上下文中使用 PCL?

把我的头发扯掉了。我无法让 libpcl 与我在 Xcode 中的 Objective 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 运行 nm 以验证丢失的符号是否在我正在链接的库中(在这种情况下为过滤器)

任何想法都非常感谢,我已经为此浪费了半周时间。

有关详细的错误消息,请参阅此屏幕截图

这是有问题的代码:

//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::PassThrough::applyFilterIndices(std::__1::vector >&)”,但 ld -y 给了我这个:

    ld: warning: option -y is obsolete and being ignored Undefined symbols for architecture x86_64:"__ZN3pcl11PassThroughINS_8PointXYZEE18applyFilterIndicesERNSt3__16vectorIiNS3_9allocatorIiEEEE", referenced from:__ZN3pcl11PassThroughINS_8PointXYZEE11applyFilterERNSt3__16vectorIiNS3_9allocatorIiEEEE in PCLProcess.o ld: symbol(s) not found for architecture x86_64

所以然后我去寻找那个符号,果然,它不见了(或不同):

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

我怀疑名字篡改?但同样,我不确定我现在在说什么,或者(更重要的是)如何解决它。

4

1 回答 1

2

简短的回答:

“构建选项”下的两个构建设置:

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

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

第二个设置(C++ 标准库)是关键;使用 libc++ 将产生上述问题中显示的“未定义符号”链接器错误。

任何尝试这个的人的详细信息:

这适用于 Xcode 4.62、llvm4.2、libpcl 1.7(目前是 dev,我从trunk 编译)和 boost 1.53。在此过程中,我遇到了 Boost 和 Cocoa 的一个已知问题,涉​​及使用 nil(请参阅此链接:https ://svn.boost.org/trac/boost/ticket/5010 )以及一些关于 boost 特征的奇怪问题(请参阅这个:c++:Boost 1.48 类型特征和 Cocoa 包含怪异)因此我最终包含了 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
于 2013-05-02T23:55:03.740 回答