我有一个项目,我正致力于运行与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忽略不需要的对象?
发布于 2014-10-30 05:06:23
如何让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被拉到链接中,搜索web和/或NVidia文档可能会显示出一种摆脱它们的方法。
https://stackoverflow.com/questions/26639784
复制相似问题