链接和使用netCDF与gcc

时间:2013-07-21 18:58:09

标签: c++ linker makefile netcdf

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

这是我的make文件

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)'|

2 个答案:

答案 0 :(得分:4)

我不确定您提供的错误是否与您显示的来源相匹配,因为构造函数签名的未定义引用与您调用的方式没有任何关系你的例子中的构造函数。

无论如何,我怀疑你的问题是订单在链接线上很重要。链接器只会遍历其库等一次,所以如果在链接行上出现LATER的东西需要在链接行上更早出现的东西,则会失败。您必须订购链接线,以便首先需要其他东西,以及稍后需要的东西。

其他一些提示:-L选项仅提供图书馆的搜索路径,因此您不需要-Lsrc,因为您没有图书馆链接来自src目录。此外,您不需要添加-L/usr/lib(实际上,这是一个非常糟糕的主意),因为编译器已经按正确的顺序搜索系统目录,并且在许多系统上(支持多个体系结构)例如)/usr/lib不是正确的地方。

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

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

bin/Debug/WilxAstakTest: $(WILXAPP)
        $(CXX) $(CXXFLAGS) -o $@ $^ $(NETCDF)

答案 1 :(得分:3)

通过将MadScientist的答案(几乎完成)与&#34; Russ&#34;的解决方案相结合解决了同样的问题。我在UniData支持页面(http://www.unidata.ucar.edu/support/help/MailArchives/netcdf/msg04846.html)中找到了存档的电子邮件:

  

您需要添加&#34; -lnetcdf&#34;到你的g ++调用结束。如果你   运行&#34;进行测试&#34;在src / cxx目录中,您将看到这是如何   测试程序是链接的。所以使用类似的东西:

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来组合它们   为方便起见,进入一个库。有便携性   尝试在所有平台上执行此操作的问题,所以接口   分发使用单独的库。

     

- 拉斯

重点是:您需要按此顺序链接BOTH -lnetcdf_c ++ AND -lnetcdf .... 我的&#39; makefile&#39;看起来像这样:

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

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

米。 (MyselfAnotherMadScientist)