我有一个项目,我正在努力与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忽略不需要的对象?
答案 0 :(得分:2)
如何让nvcc忽略不需要的对象?
在您实现这一目标之前,您需要了解哪个符号导致*.gtk.o
个对象在它们不应该被引入时被引入。
执行此操作的方法是运行与-Wl,--print-map
的链接,并查找链接器消息,例如:
Archive member included because of file (symbol)
libfoo.a(foo.o) main.o (foo)
上方main.o
引用了foo
,libfoo.a(foo.o)
定义了foo.o
,导致xxxx.gtk.o
被引入主二进制文件。
一旦您知道哪些符号导致{{1}}被拉入链接,搜索网络和/或NVidia文档可能会揭示出摆脱它们的方法。