Связывание и использование netCDF с gcc

Я пытаюсь использовать библиотеку netCDF в моем проекте C ++, но по какой-то причине не могу ее использовать.

Вот мой файл 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)'|

3

Решение

Я не уверен, что предоставляемые вами ошибки соответствуют источнику, который вы показываете, поскольку неопределенная ссылка для сигнатуры конструктора не имеет отношения к тому, как вы вызывали конструктор в вашем примере.

Во всяком случае, я подозреваю, что ваша проблема в том, что порядок имеет значение на линии связи. Компоновщик просматривает только свои библиотеки и т. Д. Один раз, поэтому, если что-то, что приходит ПОЗЖЕ в линии связи, нуждается в чем-то, что происходит РАНЬШЕ в линии связи, вы терпите неудачу. Вы должны упорядочить свою линию ссылок так, чтобы вещи, которые требуют других вещей, были на первом месте, а вещи, которые требуются, были позже.

Несколько других советов: -L опция дает только пути поиска для библиотек, поэтому вам не нужно -Lsrc здесь, как нет библиотеки вы связываете с src каталог. Также вам не нужно добавлять -L/usr/lib (на самом деле, это очень плохая идея), так как компилятор уже ищет системные каталоги в правильном порядке и во многих системах (например, поддерживающих несколько архитектур) /usr/lib не будет правильным местом.

Наконец, при написании make-файлов всегда помните, что рецепт должен создать точное имя файла цели: для GNU make вы можете использовать $@ для этого во всех случаях. И вам нужно использовать исходный файл как предварительное условие, иначе вы можете не использовать make и просто написать скрипт оболочки. Попробуй это:

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

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

Другие решения

Решил ту же проблему, объединив ответ MadScientist (почти полный) с решением «Russ», которое я нашел в архивном письме на страницах поддержки UniData (http://www.unidata.ucar.edu/support/help/MailArchives/netcdf/msg04846.html):

Вам нужно добавить «-lnetcdf» в конец вашего вызова g ++. если ты
запустите «make test» в каталоге 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, чтобы объединить их
в одну библиотеку для удобства. Были мобильность
проблемы с попытками сделать это на всех платформах, поэтому интерфейсы
распространяются для использования отдельных библиотек.

—Russ

Дело в том, что вам нужно ссылка ОБА -lnetcdf_c ++ И -lnetcdf … в этом порядке.
Мой make-файл выглядит так:

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

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

м. (MyselfAnotherMadScientist)

3

По вопросам рекламы [email protected]