Я пытаюсь использовать библиотеку 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)'|
Я не уверен, что предоставляемые вами ошибки соответствуют источнику, который вы показываете, поскольку неопределенная ссылка для сигнатуры конструктора не имеет отношения к тому, как вы вызывали конструктор в вашем примере.
Во всяком случае, я подозреваю, что ваша проблема в том, что порядок имеет значение на линии связи. Компоновщик просматривает только свои библиотеки и т. Д. Один раз, поэтому, если что-то, что приходит ПОЗЖЕ в линии связи, нуждается в чем-то, что происходит РАНЬШЕ в линии связи, вы терпите неудачу. Вы должны упорядочить свою линию ссылок так, чтобы вещи, которые требуют других вещей, были на первом месте, а вещи, которые требуются, были позже.
Несколько других советов: -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)
Решил ту же проблему, объединив ответ 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)