Question: How do I use PCL in the context of an Objective-C Cocoa (OSX, not iOS) app?
Tearing my hair out over this one.I can't get libpcl to link properly with my Objective C project in Xcode. I have checked and re-checked everything I can possibly think of. Probably doing something dumb, but I'm stumped.
Actual error is linker:
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
The code I'm trying to compile is the standard tutorial code available here: http://pointclouds.org/documentation/tutorials/passthrough.php#passthrough
I CAN get it to work without Xcode (using Cmake and command line compiling exactly as in the tutorial)
I CAN create a "command line" project and compile and link a one-off CPP file using Xcode
The issue is the same no matter what version of PCL I've tried. Macports, binary distro, self-compiled 1.6 and trunk. All the same result.
I've tried several different machines, OSX 10.7 and 10.8, same issue on both.
I've even run nm against the dylib to verify the missing symbols are in the library I'm linking (filters in this case)
Any thoughts much appreciated, I've lost half a week to this.
See this screenshot for a detailed error message.
Here is the code in question:
//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
Update
Here is one more clue. I am in over my head with respect to compilers/linkers and how they work, but now I think I know what is happening but not why (or how to fix it).
I ran the linker tool manually, and out of desperation I started plugging in obsolete flags just to see what the results were. The previous error (above) identifies the missing symbols as ""pcl::PassThrough::applyFilterIndices(std::__1::vector >&)" but ld -y gave me this:
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
So then I went looking for that symbol and, sure enough, it's missing (or different):
nm /opt/local/lib/libpcl_filters.dylib | grep __ZN3pcl11PassThroughINS_8PointXYZEE18applyFilterIndices
00000000000a0fa0
T __ZN3pcl11PassThroughINS_8PointXYZEE18applyFilterIndicesERSt6vectorIiSaIiEE
I suspect name mangling? But again, I'm not really sure what I'm talking about at this point or (more importantly) how to fix it.