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



我有 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标志时它会消失(除了删除mylib库链接((。

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

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 代码(不允许-static(?

按照 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 

最新更新