【问题标题】:Linking and using netCDF with gcc使用 gcc 链接和使用 netCDF
【发布时间】:2013-07-20 11:47:30
【问题描述】:

我试图在我的 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)'|

【问题讨论】:

    标签: c++ linker makefile netcdf


    【解决方案1】:

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

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

    其他一些提示:-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)
    

    【讨论】:

    • 该死的,它实际上是编译的。两件事 - 我不知道为什么它给了我那个签名的错误,但我主要显示的代码正是我必须调用的 NetCDF。第二 - 如果我使用名为 All 的目标,我如何使用您的示例指定我的文件位置。另外,如何向应用程序添加额外的源文件?(在 WILXAPP 中放置多个文件?)
    • 我不知道您所说的 如果我使用名为 All 的目标,我如何指定我的文件位置?如果您的意思是,您希望能够运行make All 并让它构建目标,您只需添加一条规则All : bin/Debug/WilxAstakTest。是的,要添加更多源文件,只需将它们添加到 WILXAPP 变量即可。请注意,这不是通常的做法。您将源文件直接传递给链接器,这意味着每次任何文件更改时,所有文件都将被重新编译。当你有很多资源时,这会变慢。通常你首先从.cpp 构建.o
    • 感谢您的帮助和时间。我认为这会很好地开始。当事情变得缓慢时,我会阅读更多关于 make 和 .o 文件的内容
    【解决方案2】:

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

    您需要在 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++ AND -lnetcdf ...。 我的“makefile”看起来像这样:

    NETCDF = -lnetcdf_c++ -lnetcdf
    APP = main.cpp
    CXX = g++
    CXXFLAGS = -Wall -ggdb
    
    Example: $(APP)
        $(CXX) $(CXXFLAGS) -o $@ $^ $(NETCDF)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2011-04-18
      相关资源
      最近更新 更多