【问题标题】:Problem linking static library vs dynamic library链接静态库与动态库的问题
【发布时间】:2019-03-26 02:11:27
【问题描述】:

我已经使用动态库成功开发了代码。 现在我需要搬到一个静态库。 因此,我按照作者的说明使用 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库。

我做错了吗??

感谢您的帮助

【问题讨论】:

  • @Someprogrammerdude 您可能可以将其添加为答案,因为这很可能是问题所在。
  • @Someprogrammerdude 非常感谢!!你是对的!

标签: c mpi static-libraries


【解决方案1】:

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

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


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

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

【讨论】:

    猜你喜欢
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    相关资源
    最近更新 更多