在链接静态库时编译 CUDA 代码
Compiling CUDA code while linking a static library
我有 C 代码 main_code.c
和 helper_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
我有 C 代码 main_code.c
和 helper_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