C++ NVCC正在尝试链接不必要的对象

C++ NVCC正在尝试链接不必要的对象,c++,linux,cuda,linker,nvcc,C++,Linux,Cuda,Linker,Nvcc,我有一个项目正在和CUDA合作。出于各种原因,它需要编译一个可执行文件,无论是否支持GTK,而无需重新编译所有相关文件。在C语言下,我通过将对象的基本版本编译为*.o,并将对象的GTK版本编译为*.GTK.o,来实现这一点。因此,我可以链接到该库,如果它需要使用GTK,它将引入这些函数(及其需求);如果没有,它就不会碰那些东西 转换为nvcc会导致一些问题:它可以在始终或从不GTK模式下工作;但如果我用附加的GTK对象编译库,它会拒绝忽略它们并链接一个无GTKLE的可执行文件。(它失败,错误是找

我有一个项目正在和CUDA合作。出于各种原因,它需要编译一个可执行文件,无论是否支持GTK,而无需重新编译所有相关文件。在C语言下,我通过将对象的基本版本编译为
*.o
,并将对象的GTK版本编译为
*.GTK.o
,来实现这一点。因此,我可以链接到该库,如果它需要使用GTK,它将引入这些函数(及其需求);如果没有,它就不会碰那些东西

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

我猜
nvcc
正在链接到(至少一个)嵌入在对象中的助手函数,这导致链接器解析整个对象

运行
ar d
手动将它们从库中剥离将“修复”问题,因此不存在真正的依赖关系

我正在编译/链接

/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忽略不需要的对象

如何让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被拉入链接,搜索网页和/或NVidia文档可能会发现一种摆脱它们的方法。

我被这个问题弄糊涂了。您声明的目标是编译一个有或没有GTK支持的应用程序。你还说,“它在总是或从不GTK模式下工作”,这向我表明你已经实现了你的目标。所以我不知道你在问什么。实际上,一种方便的方法是将引用GTK的所有对象文件收集到mylib_GTK.a中,所有不引用GTK的对象文件收集到mylib.a中,然后将应用程序链接到两个库中的适当库中。如中所述,如果我使用GTK编译库,然后使用它们在GTK模式下编译,它就可以工作。类似地,如果两个文件都在编译时不使用,它也可以工作。但是,如果库是用GTK编译的,没有GTK我就无法编译我的应用程序。是的,从技术上讲,把两个分开是可行的,但这是非常不寻常的。我已经演示了在使用gcc(无CUDA)时这是可行的,因为未使用的代码不包括在最终可执行文件中。如果我理解正确,您正在寻找一种链接器优化,该优化可以在链接静态库时主动删除未使用的目标模块?除了膨胀的可执行文件大小外,在可执行文件中包含未使用的目标代码是否存在问题(我想不出任何问题,因为应用程序没有使用这些代码)。考虑向NVIDIA提交增强请求,使nvcc的行为更类似于gcc。