使用 gcc 链接和使用 netCDF

use*_*833 4 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

我明白了:

 undefined reference to `NcFile::NcFile(char const*, NcFile::FileMode, unsigned long*, unsigned long, NcFile::FileFormat)'|
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 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)
Run Code Online (Sandbox Code Playgroud)