如何解决静态库符号缺少名称空间前缀,并且链接器失败
我有一个静态库“ 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 举报,一经查实,本站将立刻删除。