Не удается установить библиотеку C netCDF4 на macOS через MacPorts

#c #linker-errors #macports #netcdf4

Вопрос:

Я установил netcdf-cxx4 через Macports и загрузил пример C netCDF4 отсюда: https://www.unidata.ucar.edu/software/netcdf/examples/programs/SimpleXyWr.cpp

Я довольно незнаком с настройкой параметров связывания, и я попытался скомпилировать/связать программу с помощью следующей команды:

 g   SimpleXyWr.cpp -o SimpleXyWr.out -I/opt/local/include -L/opt/local/lib -lnetcdf -lnetcdf_c  4
 

Однако это приводит к следующей ошибке:

 Undefined symbols for architecture x86_64:
  "__ZN6netCDF6NcFileC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_8FileModeE", referenced from:
      _main in cco9p4yv.o
  "__ZNK6netCDF7NcGroup6addDimERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEm", referenced from:
      _main in cco9p4yv.o
  "__ZNK6netCDF7NcGroup6addVarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_6NcTypeERKSt6vectorINS_5NcDimESaISD_EE", referenced from:
      _main in cco9p4yv.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
 

Я совершенно не знаю, как решить эту проблему.

Обновление: Я частично решил проблему: я понял, что MacPorts использует clang для компиляции порта. Поэтому я попытался установить netcdf-cxx4 с помощью следующей команды:

 sudo port -s -v install netcdf-cxx4 configure.compiler=macports-gcc-10
 

Установка заканчивается:

 netcdf-cxx4 is using libstdc   (this installation is configured to use libc  )
--->  Found 1 broken port, determining rebuild order
You can always run 'port rev-upgrade' again to fix errors.
The following ports will be rebuilt: netcdf-cxx4 @4.3.0
Continue? [Y/n]:
 

Если я наберу Y, netcdf-cxx4 будет переустановлен (но снова с лязгом — что мне не помогает). Если я прервусь, я смогу использовать библиотеку netCDF4 (и, похоже, все работает). Однако, чтобы решить вышеуказанную проблему, я попытался установить netcdf-cxx4 с помощью команды:

 sudo port -s -v install netcdf-cxx4 configure.compiler=macports-gcc-10 configure.cxx_stdlib=macports-libstdc  
 

Но это заканчивается сообщением об ошибке:

 checking whether the C compiler works... no
configure: error: in `/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_macports_release_tarballs_ports_devel_gettext/gettext/work/gettext-0.19.8.1/gettext-runtime':
configure: error: C compiler cannot create executables
See `config.log' for more details
configure: error: ./configure failed for gettext-runtime
Command failed:  cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_macports_release_tarballs_ports_devel_gettext/gettext/work/gettext-0.19.8.1" amp;amp; ./configure --prefix=/opt/local ac_cv_prog_AWK=/usr/bin/awk ac_cv_path_GREP=/usr/bin/grep ac_cv_path_SED=/usr/bin/sed --disable-csharp --disable-java --disable-native-java --disable-openmp --without-emacs --with-included-gettext --with-included-glib --with-included-libcroco --with-included-libunistring --with-included-libxml --without-cvs --without-git --without-xz 
Exit code: 77
Error: Failed to configure gettext, consult /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_macports_release_tarballs_ports_devel_gettext/gettext/work/gettext-0.19.8.1/config.log
Error: Failed to configure gettext: configure failure: command execution failed
Error: See /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_macports_release_tarballs_ports_devel_gettext/gettext/main.log for details.
Error: Unable to execute port: upgrade netcdf failed
 

Что я могу сделать, чтобы решить эту проблему? Спасибо за любой вклад!

Комментарии:

1. Можете ли вы grep найти в этих библиотеках имена отсутствующих символов?

2. Спасибо за ваше предложение. Похоже, я сузил круг причин проблемы (см. Информацию об обновлении выше).

Ответ №1:

Вы правильно сделали вывод, что проблема заключалась в том, что netcdf-cxx4 был скомпилирован MacPorts с помощью clang , в то время как вы пытались скомпилировать свою программу с помощью g . clang использует стандартную библиотеку libc , в то время как g использует стандартную библиотеку libstdc ; они несовместимы друг с другом. Программа на C и все библиотеки, которые она использует, должны использовать одну и ту же библиотеку C .

Где вы ошиблись, так это в попытке переосмыслить выбор компилятора MacPorts, переопределив configure.compiler его в командной строке. MacPorts не предназначен для этого. (Возможность переопределять переменные в командной строке предназначена для разработчиков MacPorts, чтобы помочь им в отладке проблем.) Вместо этого вам следовало сделать одну из двух вещей:

  1. Позвольте MacPorts скомпилировать netcdf-cxx4 с помощью clang , а также скомпилировать вашу программу с помощью clang . Это рекомендуемый вариант, поскольку clang является предпочтительным компилятором на macOS. Или:
  2. Запустите port variants netcdf-cxx4 и обнаружьте, что автор порта netcdf-cxx4 предвидел, что вы, возможно, захотите скомпилировать его с помощью разных компиляторов, и предоставил варианты, позволяющие вам это сделать. Например, вы можете запустить sudo port install netcdf-cxx4 gcc10 его для компиляции с помощью MacPorts gcc 10.