NVCC试图链接不必要的对象

时间:2014-10-29 20:13:05

标签: c++ linux cuda linker nvcc

我有一个项目,我正在努力与CUDA一起运行。由于各种原因,它需要在有或没有GTK支持的情况下编译可执行文件,不用重新编译所有相关文件。在C下,我通过将对象的基本版本编译为*.o并将对象的GTK版本编译为*.gtk.o来实现此目的。因此,我可以链接到该库,如果需要使用GTK,它将引入这些功能(及其要求);如果没有,它将不会触及那些物体。

转换为nvcc会导致一些问题:它可以在总是或从不在GTK模式下工作;但如果我用其他GTK对象编译库,它会拒绝忽略它们并链接GTKless可执行文件。 (它失败了,因为无法找到我调用的cairo函数。)

我猜测nvcc链接到对象中嵌入的辅助函数(至少其中一个),导致链接器解析整个对象。

运行ar d <lib> <objects.gtk.o>手动从库中删除它们将“修复”问题,因此没有真正的依赖。

我正在编译/链接

/usr/local/cuda/bin/nvcc --compiler-options -Wall --compiler-options -pipe 
        -rdc=true -O0 -g -G -I inc -I inc/ext -arch compute_20 -o program 
        program.cu obs/external.o libs/base.a libs/extra.a libs/core.a -lm

如何让nvcc忽略不需要的对象?

1 个答案:

答案 0 :(得分:2)

  

如何让nvcc忽略不需要的对象?

在您实现这一目标之前,您需要了解哪个符号导致*.gtk.o个对象在它们不应该被引入时被引入。

执行此操作的方法是运行与-Wl,--print-map的链接,并查找链接器消息,例如:

Archive member included because of file (symbol)
libfoo.a(foo.o)               main.o (foo)

上方main.o引用了foolibfoo.a(foo.o)定义了foo.o,导致xxxx.gtk.o被引入主二进制文件。

一旦您知道哪些符号导致{{1}}被拉入链接,搜索网络和/或NVidia文档可能会揭示出摆脱它们的方法。