建立CUDA和C++;使用自动工具 我为主要的C++编写了大量的科学工具,但也有些CUDA。我找到了一个编译和链接CUDA代码到AutoToC中C代码的例子,但是我不能用C++代码复制成功。我听说使用CMake要容易得多,但不幸的是,我们致力于使用自动工具

建立CUDA和C++;使用自动工具 我为主要的C++编写了大量的科学工具,但也有些CUDA。我找到了一个编译和链接CUDA代码到AutoToC中C代码的例子,但是我不能用C++代码复制成功。我听说使用CMake要容易得多,但不幸的是,我们致力于使用自动工具,c++,cuda,autotools,C++,Cuda,Autotools,在旧的手工编写的Makefile中,我们只需使用make规则,使用nvcc将“cuda_kernels.cu”编译成“cuda_kernels.o”,并将cuda_kernels.o添加到要编译成最终二进制文件的对象列表中。很好,很简单,而且很有效 另一方面,Autotools的基本策略似乎是使用Libtool将.cu文件编译成“libcudafiles.la”,然后将其余代码链接到该库。然而,链接失败,链接器中有一大堆“未定义的引用…”语句。这似乎是g++与nvcc编译器之间的一个名称冲突问题

在旧的手工编写的Makefile中,我们只需使用make规则,使用nvcc将“cuda_kernels.cu”编译成“cuda_kernels.o”,并将cuda_kernels.o添加到要编译成最终二进制文件的对象列表中。很好,很简单,而且很有效

另一方面,Autotools的基本策略似乎是使用Libtool将.cu文件编译成“libcudafiles.la”,然后将其余代码链接到该库。然而,链接失败,链接器中有一大堆“未定义的引用…”语句。这似乎是g++与nvcc编译器之间的一个名称冲突问题(这可以解释为什么它与C代码一起工作),但我不确定现在该怎么办

所有.cpp和.cu文件都在top/src目录中,所有编译都在top/obj目录中完成。以下是obj/Makefile.am的相关详细信息:

cuda_kernals.cu.o:
    $(NVCC) -gencode=arch=compute_20,code=sm_20 -o $@ -c $<

libcudafiles_la_LINK= $(LIBTOOL) --mode=link $(CXX) -o $@ $(CUDA_LDFLAGS) $(CUDA_LIBS)

noinst_LTLIBRARIES = libcudafiles.la
libcudafiles_la_SOURCES = ../src/cuda_kernels.cu

___bin_main_LDADD += libcudafiles.la
___bin_main_LDFLAGS += -static
cuda_kernals.cu.o:
$(NVCC)-gencode=arch=compute_20,code=sm_20-o$@-c$<
libcudafiles\u la\u LINK=$(LIBTOOL)——mode=LINK$(CXX)-o$@$(CUDA\u LDFLAGS)$(CUDA\u LIBS)
noinstltlibraries=libcudafiles.la
libcudafiles_la_SOURCES=../src/cuda_kernels.cu
___bin_main_LDADD+=libcudafiles.la
___bin_main_LDFLAGS+=-静态
作为参考,我在我们的GPU集群上得到的示例可以在clusterchimps.org上找到


感谢您的帮助

libtool
automake
一起当前生成
foo.lo
(libtool对象元数据)文件、非PIC(静态)对象
foo.o
和PIC对象
.libs/foo.o

对于一致的
.lo
文件,我会使用如下规则:

.cu.lo:
        $(LIBTOOL) --tag=CC --mode=compile $(NVCC) [options...] -c $<
.cu.lo:
$(LIBTOOL)--tag=CC--mode=compile$(NVCC)[options…]-c$<
我不知道nvcc是否或如何处理
-PIC
标志。更多选择。我不知道你在程序中做什么调用,但是你是在用C链接前向声明CUDA代码吗?e、 g

extern“C”void cudamain(…)


似乎其他人遇到了libtool问题。最糟糕的情况是,您可能需要一个模仿
.lo
语法和文件位置的“脚本”解决方案,如网站上所述。

虽然它不能直接回答您的问题,但您是否可以选择使用cmake?使用起来容易多了。