Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确链接PCL库,以便在Xcode编译的objective-C应用程序中使用?_Objective C_Xcode_Point Cloud Library - Fatal编程技术网

如何正确链接PCL库,以便在Xcode编译的objective-C应用程序中使用?

如何正确链接PCL库,以便在Xcode编译的objective-C应用程序中使用?,objective-c,xcode,point-cloud-library,Objective C,Xcode,Point Cloud Library,问题:如何在Objective-C Cocoa(OSX,而非iOS)应用程序中使用PCL 在这个问题上我非常恼火。我无法让libpcl与我在Xcode中的Objective C项目正确链接。我反复检查了我能想到的一切。可能是在做傻事,但我被难住了 实际错误是链接器: Undefined symbols for architecture x86_64: "pcl::PassThrough<pcl::PointXYZ>::applyFilterIndices(std::__1::vect

问题:如何在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
我怀疑名字弄乱了?但是,再一次,我不确定我现在谈论的是什么,或者(更重要的)如何修复它

简短答复: “生成选项”下的两个生成设置:

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

<强> C++标准库:LIbSTDC++(GNU C++标准库)< /P> 第二个设置(C++标准库)是关键设置;使用libc++将产生上述问题中所示的“未定义符号”链接器错误

尝试此操作的任何人的详细信息: 这适用于Xcode 4.62、llvm4.2、libpcl 1.7(目前是开发人员,我是从主干编译的)和boost 1.53。一路上,我遇到了Boost和Cocoa的一个已知问题,涉及到nil的使用(参见此链接:)以及Boost特性的一些奇怪之处(参见此:),因此我最终包括了如下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
#定义零增压#零
#定义零Boost_Nil
#ifdef检查
#未定义检查
#恩迪夫
#包括
#包括
#包括
#未定义零
#未定义零

您似乎有ObjC++头文件。请记住,使用.mm扩展文件引用C++上下文中的任何内容,比如PCLI怀疑类似的东西,最初是使用同一个项目中的Cubter(C++)的早期问题。我正在使用mm,但我可能还是错过了一些东西。。。我将编辑Q并包含问题代码。如果有人能解释为什么这是真的(更改标准库会导致链接器在动态库中查找/未查找符号),我将不胜感激。特别是,同一个项目正在使用其他更喜欢C11和libstdc的库(我也会!)。您将libpcl链接到哪个标准库?许多库默认为libstdc++谢谢。。。我原以为我已经将PCL与libc++联系起来了,但我仔细检查了一下,发现是libstd(事实上,我无法针对libc++直接编译PCL本身,但这是另一个问题)。我很清楚,这通常是真的吗(您必须根据您的库编译时所使用的同一个标准库来编译您的项目)?这使得混合库非常困难,除非它们都可以以相同的方式编译(并且如果它们以二进制文件的形式出现,除非您确实知道它们使用的是什么标准库),但至少它解释了我遇到的问题。是的。恐怕你遇到了C++最令人讨厌的方面之一。看看有什么解释。恶心!但是非常感谢你提供的信息/链接,至少我理解这个问题。
nm /opt/local/lib/libpcl_filters.dylib | grep __ZN3pcl11PassThroughINS_8PointXYZEE18applyFilterIndices
00000000000a0fa0 
T  __ZN3pcl11PassThroughINS_8PointXYZEE18applyFilterIndicesERSt6vectorIiSaIiEE
#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