4

我试图在我的 C++ 项目中使用 netCDF 库,但由于某种原因,我不能使用它。

这是我的制作文件

NETCDF = -L/usr/lib -lnetcdf_c++
WILXAPP = -Lsrc src/wilxtest.cpp -o bin/Debug/WilxAstakTest

Debug:
    g++ -Wall -ggdb $(NETCDF) $(WILXAPP)

在我的 cpp 文件中,我基本上有(消除了膨胀)

#include <iostream>
#include <netcdfcpp.h>

int main(int argc, char* argv[])
{
   NcFile dataFile("simple_xy.nc", NcFile::Replace);
}

我明白了:

 undefined reference to `NcFile::NcFile(char const*, NcFile::FileMode, unsigned long*, unsigned long, NcFile::FileFormat)'|
4

2 回答 2

5

我不确定您提供的错误是否与您显示的源相匹配,因为构造函数签名的未定义引用与您在示例中调用构造函数的方式无关。

无论如何,我怀疑你的问题是链接线上的顺序很重要。链接器只遍历它的库等一次,所以如果链接线上稍后出现的东西需要链接线上更早出现的东西,你就会失败。您必须对链接线进行排序,以便需要其他东西的东西在前,需要的东西在后。

其他一些提示:该-L选项仅提供库的搜索路径,因此您不需要-Lsrc此处,因为您没有从src目录链接的库。此外,您不需要添加-L/usr/lib(事实上,这是一个非常糟糕的主意),因为编译器已经以正确的顺序搜索系统目录,并且在许多系统上(例如支持多种架构)/usr/lib不会是正确的位置.

最后,在编写 makefile 时,请始终记住配方应该创建目标的确切文件名:对于 GNU make,您可以$@在所有情况下使用它。而且你需要使用源文件作为先决条件,否则你还不如不费心使用make,只写一个shell脚本。尝试这个:

NETCDF = -lnetcdf_c++
WILXAPP = src/wilxtest.cpp
CXX = g++
CXXFLAGS = -Wall -ggdb

bin/Debug/WilxAstakTest: $(WILXAPP)
        $(CXX) $(CXXFLAGS) -o $@ $^ $(NETCDF)
于 2013-07-21T19:26:49.607 回答
3

通过将 MadScientist 的答案(几乎完整)与我在 UniData 支持页面(http://www.unidata.ucar.edu/support/help/MailArchives/ netcdf/msg04846.html):

您需要在 g++ 调用的末尾添加“-lnetcdf”。如果您在 src/cxx 目录中运行“make test”,您将看到这是链接测试程序的方式。所以使用类似的东西:

g++ -o example -I<PATH>netcdf-3.5.1-beta13/include example.cpp -L<PATH>netcdf-3.5.1-beta13/lib -lnetcdf_c++ -lnetcdf

如果您想一步完成编译和链接。

默认安装将 C++ 库存储在与 C 库不同的库文件中,但我认为您可以使用 ld 将它们组合成一个库以方便。尝试在所有平台上执行此操作存在可移植性问题,因此将接口分发为使用单独的库。

——拉斯

关键是:您需要按此顺序链接 -lnetcdf_c++ 和 -lnetcdf ...。我的“makefile”看起来像这样:

NETCDF = -lnetcdf_c++ -lnetcdf
APP = main.cpp
CXX = g++
CXXFLAGS = -Wall -ggdb

Example: $(APP)
    $(CXX) $(CXXFLAGS) -o $@ $^ $(NETCDF)

米。(我自己另一个疯狂的科学家)

于 2014-08-26T10:50:40.570 回答