静态库符号缺少名称空间前缀,并且链接器失败

问题描述

我有一个静态库“ libCam.a”,该库包含一个基于此Camera类代码的Camera类对象

#include "Camera.h"
#include <optix_world.h>
#include "Arcball.h"

using namespace optix;
bool Camera::rotate( float dx,float dy )
{
    static sutil::Arcball arcball;  
    const float2 a = make_float2(1.0,2.0); 
    const float2 b = make_float2(3.0,4.0);
    rotMatrix = arcball.rotate(a,b);   
    return true;
}

我还有一个静态库libSutil.a,它在名称空间“ sutil”下包含“ Arcball”类。

当我尝试以下测试代码时:

 #include "Camera.h"
    int main() {
       Camera cam  ;
       cam.rotate(1.0f,2.9f);
    }

我收到以下链接错误:

./lib/libCam.a(Camera.cpp.o): In function 
  Camera::rotate(float,float):
    /ray/irsa/nnn/src/IRay/Camera.cpp:118: undefined 
   reference to 
   sutil::Arcball::rotate(float2 const&,float2 const&) 
             const
    collect2: error: ld returned 1 exit status

在两个库中查看全局错误符号:

  >nm -C ../../build/lib/libSutil.a  | grep rotate
       00000000000007cc T 
       sutil::Arcball::rotate(optix::float2 const&,optix::float2 const&) const

   >nm -C ../../build/lib/libCam.a  | grep rotate
       0000000000000020 b guard variable for 
       Camera::rotate(float,float)::arcball
       00000000000044a6 T Camera::rotate(float,float)
                 U sutil::Arcball::rotate(float2 const&,float2 const&) const
      0000000000000010 b Camera::rotate(float,float)::arcball

问题是为什么libCam.a符号表在旋转参数中从optix ::名称空间限定符中删除。我什至使用名称空间删除了该文件,并使用optix ::前缀显式地限定了每个变量。但这没有任何区别。请注意,float2,Matrix4x4,make_float2均来自“ optix”命名空间。

链接器为什么会失败?我尝试更改库链接顺序没有任何运气。我在做什么错了。

经过更多搜索后,我现在确信链接失败是CMAKE的伪影。我的问题适合以下模式。 “ a”级使用“ b”级 主要使用“ a”类。

CMAKE FILE PATTERN:
add_library(b STATIC b.cpp b.h)
add_library(a STATIC a.cpp a.h)
add_executable(main main.cpp)

我已经使用两个版本的CMAKE测试了该链接,但链接失败。我认为CMAKE并非旨在优雅地处理这一问题。缺少名称空间限定符的问题与此无关。但这是另一个要回答的问题。

无论如何,现在我可以确认给出的here解决了链接问题。

target_link_libraries(c INTERFACE a b)
add_executable(main main.cpp)
target_link_libraries(main c)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...