链接静态库与动态库时出现问题

时间:2019-03-25 15:08:14

标签: c mpi static-libraries

我已经使用动态库成功开发了代码。 如今,我需要移至静态库。 因此,我使用作者指定的make构建了库,但是当我尝试构建程序时,却遇到了以下消息:

/usr/bin/ld: /usr/local/lib/libfft3dmpi.a(remap3d_wrap.o): in function `remap3d_create':
/home/mirco/Scrivania/fftmpi-1Oct18/src/remap3d_wrap.cpp:36: undefined reference to `operator new(unsigned long)'
/usr/bin/ld: /usr/local/lib/libfft3dmpi.a(remap3d_wrap.o): in function `remap3d_create_fortran(int, void**)':
/home/mirco/Scrivania/fftmpi-1Oct18/src/remap3d_wrap.cpp:45: undefined reference to `operator new(unsigned long)'

以此类推。 我试图在makefile中指定库的完整路径,或者使用-l(name of the library),但我仍然遇到相同的消息

我的makefile是

$(CC) -O3 -o exe channel_mpi.o initialization.o convol_trasp.o fft_support.o data_man.o dnsdata.o dnsdirect.o /home/mirco/Scrivania/fftmpi-1Oct18/src/libfft3dmpi.a -lm 

编译器是h5pcc,它被mpicc包裹,并带有一些使用HDF5库的标志。

我做错了吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

operator new是C ++。似乎您正在使用C ++代码而不是C进行构建。makefile变量$(CC)是C编译器,$(CXX)是C ++编译器。

因此解决方案是切换用于链接的编译器。


链接C ++前端程序(在Linux系统上通常为g++)时,将自动添加C ++标准库。该库包含许多C ++标准函数的默认实现,例如C ++ new运算符所需的函数。

也可以使用C前端(gcc),但是您必须显式地与C ++库链接。对于gcc,这意味着您必须添加-lstdc++