在链接静态库时编译 CUDA 代码

Compiling CUDA code while linking a static library

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

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。我可以 link 它有:

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。但是,linking 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 link 时不能使用静态标志(因为当我删除 -static 标志时它消失了(除了还删除 mylib 图书馆 linking)).

然后我尝试单独编译 helper_code.c 然后 link 将其编译为 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 中定义的函数,这意味着 linking 到 mylib 不起作用。我可以通过包含 mylib 库并使用 -static 标志来解决该错误,但这会破坏 CUDA linking.

我可以单独让 CUDA linking(到 cuda_code.cu)工作或 mylib linking 工作,但不能同时工作。

所以有没有 link mylib(需要 -static)的解决方法,同时 linking 我的 CUDA 代码(不允许-static)?

根据 linkedin 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