gpt4 book ai didi

c++ - NVCC 试图链接不必要的对象

转载 作者:太空狗 更新时间:2023-10-29 12:15:27 25 4
gpt4 key购买 nike

我有一个项目正在使用 CUDA 运行。由于各种原因,它需要编译一个可执行文件,无论是否支持 GTK,无需重新编译所有相关文件。在 C 下,我通过将对象的基本版本编译为 *.o 来完成此操作。和对象的 GTK 版本到 *.gtk.o .因此,我可以链接到那个库,如果它需要使用 GTK,它将引入那些函数(及其要求);如果没有,它就不会触及那些对象。

转换为 nvcc引起了一些问题:它在 always 或 never 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 忽略不需要的对象?

最佳答案

How can I get nvcc to ignore the unneeded objects?

在实现该目标之前,您需要了解是哪个符号导致 *.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 被拉入链接,搜索网络和/或 NVidia 文档可能会找到摆脱的方法

关于c++ - NVCC 试图链接不必要的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26639784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com