2

質問: Objective-C Cocoa (iOS ではなく OSX) アプリのコンテキストで 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 を使用して 1 回限りの 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

アップデート

ここにもう 1 つの手がかりがあります。私はコンパイラ/リンカとそれらがどのように機能するかに関して頭を悩ませていますが、今では何が起こっているのかはわかっていますが、その理由 (または修正方法) はわかっていません。

  • 私はリンカ ツールを手動で実行し、必死になって結果を確認するためだけに廃止されたフラグをプラグインし始めました。前のエラー (上記) は、不足しているシンボルを ""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