首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法破解nvlink错误

无法破解nvlink错误
EN

Stack Overflow用户
提问于 2014-01-16 21:26:31
回答 3查看 1.8K关注 0票数 0

我正在尝试用nvcc构建一个项目。我收到了我所见过的最令人烦恼的nvlink error:消息。

以下是链接语句:

代码语言:javascript
复制
nvcc    -rdc=true -arch=sm_21 -O3 -Xcompiler -fPIC -I"/usr/local/ACE_wrappers" -I"/usr/local/ACE_wrappers/TAO" -I"/usr/local/DDS" -I"/usr/include/Qt" -I"/usr/include/QtCore" -I"/usr/include/QtGui" -I"../../include" -I"../../include/DDS" -I"../../include/CoordinateTransforms" -I"../../include/DDS/IDLBrokerTemplates" -I"../../def/IDL" -I"../../def/CMD" -I"../../def/XSD" -I"../../src/NetAcquire" -I"/usr/local/ACE_wrappers/TAO/orbsvcs" -I"/usr/local/include/lct.7.5.4" -L"." -L"/usr/local/ACE_wrappers/lib" -L"/usr/local/DDS/lib" -L"/usr/lib64" -L"/usr/local/lib64" -L"../../def/IDL/lib" -L"../../def/XSD" -L"/usr/local/lib" .obj/../../src/Component.o .obj/../../src/COM.o .obj/../../src/DDS/EntityManager.o .obj/../../src/IDLBrokerTemplates/CommandManager.o .obj/../../src/IDLBrokerTemplates/OptionManager.o .obj/../../include/ApplicationProcessStateReporter_moc.o .obj/../../src/Application.o .obj/../../src/CoordinateTransforms/Site.o .obj/../../src/CoordinateTransforms/Geodesy.o .obj/../../src/CoordinateTransforms/Earth.o .obj/../../src/CoordinateTransforms/StateVector.o .obj/../../src/CoordinateTransforms/KeplerianImpact.o .obj/../../src/CoordinateTransforms/GeodeticPosition.o .obj/../../src/IDLBrokerTemplates/MeasurandSubscription.o .obj/../../src/NetAcquire/NetAcquire.o .obj/DataLossFlightTimeImpl.o .obj/DataLossFlightTime.o .obj/DftTable.o .obj/OptionListener.o .obj/PrimaryListener.o .obj/MissionTimeListener.o .obj/DeadMan.o .obj/main.o .obj/../../src/XML/spline.o .obj/../../src/XML/FpTable.o -l"naps-x86_64" -l"naio-x86_64" -l"nalct-x86_64" -l"curl" -l"TAO_Messaging" -l"TAO_Valuetype" -l"TAO_PI_Server" -l"TAO_PI" -l"TAO_CodecFactory" -l"TAO_CosNaming" -l"armadillo" -l"boost_filesystem" -l"boost_system" -l"xerces-c" -l"jarssXSD" -l"OpenDDS_Tcp" -l"JARSSRTv10" -l"QtNetwork" -l"fontconfig" -l"QtGui" -l"QtCore" -l"OpenDDS_Rtps_Udp" -l"OpenDDS_Rtps" -l"OpenDDS_Multicast" -l"OpenDDS_Udp" -l"OpenDDS_InfoRepoDiscovery" -l"OpenDDS_Dcps" -l"TAO_PortableServer" -l"TAO_AnyTypeCode" -l"TAO" -l"ACE"  -o "DFT"

我得到了

代码语言:javascript
复制
nvlink error   : Undefined reference to '_ZN5JARSS15KeplerianImpactC1ERKdS2_S2_S2_S2_S2_'
nvlink error   : Undefined reference to '_ZNK5JARSS15KeplerianImpact9getStatusEv'
nvlink error   : Undefined reference to '_ZNK5JARSS15KeplerianImpact13getImpactTimeEv'
nvlink error   : Undefined reference to '_ZNK5JARSS15KeplerianImpact11getPlhStateEv'
nvlink error   : Undefined reference to '_ZN5JARSS15KeplerianImpactD1Ev'
nvlink error   : Undefined reference to '_ZN5JARSS7Geodesy12EFG2GeodeticERKdS2_S2_PdS3_S3_'

我确信这些函数/文件都包含在编译中。从编译中可以看出,KeplerianImpact.cppGeodesy.cpp都在其中。

有什么方法可以让链接输出更容易阅读,这样我就可以调试它了吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-17 18:32:21

我想出来了。

我需要在正确的文件中定义我的函数。例如,在Foo.h

代码语言:javascript
复制
class Foo {
public:
    __host__ __device__
    Foo();
}

以及Foo.cu 中的函数定义,而不是我最初认为的 Foo.cpp

代码语言:javascript
复制
 Foo::Foo() {}

对于常量变量,我需要实现一个稍微不同的策略。

下面是我开始使用的C++类的一个示例:

代码语言:javascript
复制
class Foo {
public:
    static double const epsilon;
    static void functionThatUsesEpsilon();
    /**/
}

必须转换为使用全局命名空间作为epsilon def'n。

代码语言:javascript
复制
namespace foo {
    extern __constant__ double epsilon;
} 

class Foo {
public:
    // same stuff as before with the addition of this function
    __host__ __device__
    static inline double getEpsilon() {
#ifdef __CUDACC__
         return foo::epsilon;
#else
         return epsilon;
#endif
    }  

    static void functionThatUsesEpsilon() {
        if (bar < getEpsilon()) { // etc }
    }
};

上面的ifdef将返回主机或设备代码的变量的正确版本。无论我在哪里引用了Foo::epsilon,我都需要用Foo::getEpsilon()替换它,从而返回正确的epsilon。

希望这对将来的人有帮助。谢谢@RobertCrovella让我思考。

票数 1
EN

Stack Overflow用户

发布于 2014-01-16 22:04:55

使用c++filt来解析名称。例如:

$ _ZN5JARSS15KeplerianImpactC1ERKdS2_S2_S2_S2_S2_ JARSS::KeplerianImpact::KeplerianImpact(double const&,double const&)

票数 5
EN

Stack Overflow用户

发布于 2014-01-17 06:29:37

前面遇到了这个问题,我想您还没有使用设备链接器链接设备对象。

通过编译生成设备的可重定位代码,如下所示(-dc是相当于-c的设备,有关更多信息,请参见手册 )

代码语言:javascript
复制
nvcc –arch=sm_21 –dc a.cu b.cu

通过在最终主机链接之前调用nvlink或dlink来链接代码的设备部分

代码语言:javascript
复制
nvlink -arch=sm_21 a.o b.o -o link.o (or)
nvcc –arch=sm_21 –dlink a.o b.o –o link.o

最后使用主机编译器形成一个可执行文件,

代码语言:javascript
复制
g++ a.o b.o link.o –L<path> -lcudart
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21173232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档