链接静态库与动态库的问题

Problem linking static library vs dynamic library

我已经使用动态库成功开发了一段代码。 现在我需要移动到静态库。 所以我已经按照作者的指定使用 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 库。

我做错了吗??

感谢您的帮助

operator new 是 C++ 的东西。看起来你是用 C++ 代码而不是 C 构建的。makefile 变量 $(CC) 是 C 编译器,$(CXX) 是 C++ 编译器。

所以解决方案是切换您用于 linking 的编译器。


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

也可以使用 C 前端 (gcc),但是您必须明确地 link 使用 C++ 库。对于 gcc 这意味着您必须添加 -lstdc++.