链接静态库时编译 CUDA 代码

标签 c compilation cuda g++ nvcc

我有 C 代码 main_code.chelper_code.c。前者依赖于一些 CUDA 代码 cuda_code.cu,后者依赖于外部库 mylib。为了让我的外部库 mylib 正常工作,我需要使用 -static 标志将其链接到我的代码:

g++ main_code.c helper_code.c -o main_code -static -L/usr/local/mylib/lib -lmylib -lmylib2

但是main_code.c也依赖于CUDA代码-cuda_code.cu。我可以将其链接到:

nvcc cuda_code.cu -c
g++ main_code.c -o main_code cuda_code.o -L/usr/local/cuda-10.0/lib64 -lcudart -lpthread

我想将我的代码与 CUDA 代码和外部库 mylib 一起编译。但是,链接 mylib 仅适用于 -static 标志。一个天真的尝试如下,但它不起作用:

nvcc cuda_code.cu -c
g++ main_code.c helper_code.c -o main_code cuda_code.o -static -L/usr/local/mylib/lib -lmylib -lmylib2 -L/usr/local/cuda-10.0/lib64 -lcudart -lpthread

这给出了错误:

/usr/bin/ld: cannot find -lcudart

我假设是因为在与 CUDA 链接时无法使用 static 标志(因为当我删除 -static 标志时它就会消失(此外还删除 mylib 库链接))。

然后,我尝试单独编译 helper_code.c,然后将其链接到 main_code.c,因为它只是 helper_code.c 需要 mylib:

helper.o:
    g++ helper_code.c -c -static -L/usr/local/mylib/lib -lmylib -lmylib2

cuda-code.o:
    nvcc cuda_code.cu -c

main-code: helper.o cuda-code.o
    g++ main_code.c -o main_code helper_code.o cuda_code.o -L/usr/local/cuda-10.0/lib64 -lcudart -lpthread

但这也行不通。我收到一个 undefined reference 错误,该错误引用了mylib中定义的函数,这意味着到mylib的链接不起作用。我可以通过包含 mylib 库并使用 -static 标志来解决该错误,但这会破坏 CUDA 链接。

我可以单独使 CUDA 链接(到 cuda_code.cu)工作或使 mylib 链接工作,但不能同时实现两者。

那么有没有一种解决方法可以链接 mylib (需要 -static),同时也链接我的 CUDA 代码(不允许 -静态)?

最佳答案

根据talonmies评论中链接的答案,以下方法实现了这一点:

g++ main_code.c -o main_code helper_code.o cuda_code.o -L/usr/local/mylib/lib -L/usr/local/cuda-10.0/lib64 -Wl,-Bstatic -lmylib -lmylib2 -Wl,-Bdynamic -lcudart 

关于链接静态库时编译 CUDA 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59261878/

相关文章:

c - 计算所选单词的字符数的程序

java - 无法将名称解析为 (n) 'element declaration' 组件

java - 如何在不委托(delegate)给其他编译器的情况下对 .cu 文件调用 nvcc?

c - GSoap 客户端无法将参数值传递给服务器

c - C 中悬空指针和字符数组的问题

c - 宏常量中的 float 学,同时保持整数性

docker - 动态决定要在哪个GPU上运行-NVIDIA docker上的TF

GCC——针对 HP-UX 的目标三元组

emacs - 如何仅针对 Emacs 中的特定模式或缓冲区过滤编译输出?

cuda - 直接在主机上访问设备矢量元素的最快方法