Неопределенные символы для архитектуры x86_64: "_fcloseall" - PullRequest
0 голосов
/ 11 ноября 2018

Я компилирую hadoop-yarn-nodemanager.

Среда компиляции: MacOS-10.14, java-1.7.0_80, cmake3.13.0-rc3 с clang-1000.10.44.4, Maven 3.6.0, protocbuf 2.5.0.

Я пытаюсь установить Hadoop-2.2.0 на MacOS, но, как показывает его документ,

Собственная библиотека hadoop поддерживается только на платформах * nix. Библиотека не для работы с Cygwin или платформой Mac OS X.

Так что мне нужно пересобрать исходный код Hadoop. В загруженной папке hadoop-2.2.0-src, работающей mvn package -Pdist,native -DskipTests -Dtar, и новая собственная библиотека должна была находиться в hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.2.0/lib/native после минутной компиляции. Однако я продолжал получать сообщения об ошибках. Некоторые уже исправлены с модификациями исходных кодов, но теперь я попал в ловушку компиляции hadoop-yarn-server-nodemanager.

Процесс компиляции сейчас

Вот сообщение об ошибке:

 [exec] [ 57%] Linking C executable target/usr/local/bin/test-container-executor
 [exec] /Applications/CMake.app/Contents/bin/cmake -E cmake_link_script CMakeFiles/test-container-executor.dir/link.txt --verbose=1
 [exec] /Library/Developer/CommandLineTools/usr/bin/cc  -g -Wall -O2 -D_GNU_SOURCE -D_REENTRANT -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/test-container-executor.dir/main/native/container-executor/test/test-container-executor.c.o  -o target/usr/local/bin/test-container-executor libcontainer.a 
 [exec] Undefined symbols for architecture x86_64:
 [exec]   "_fcloseall", referenced from:
 [exec]       _launch_container_as_user in libcontainer.a(container-executor.c.o)
 [exec] ld: symbol(s) not found for architecture x86_64
 [exec] clang: error: linker command failed with exit code 1 (use -v to see invocation)
 [exec] make[2]: *** [target/usr/local/bin/test-container-executor] Error 1
 [exec] make[1]: *** [CMakeFiles/test-container-executor.dir/all] Error 2
 [exec] make: *** [all] Error 2

Я пытался переключить компилятор cmake с clang на gcc, но безрезультатно.

Относится к сообщению об ошибке, я нахожу следующие коды.

В hadoop-2.2.0-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/CMakeLists.txt:

add_executable(test-container-executor
    main/native/container-executor/test/test-container-executor.c
)
target_link_libraries(test-container-executor
    container
)
output_directory(test-container-executor target/usr/local/bin)

В hadoop-2.2.0-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/configuration.c:

int launch_container_as_user(const char *user, const char *app_id, 
               const char *container_id, const char *work_dir,
               const char *script_name, const char *cred_file,
               const char* pid_file, char* const* local_dirs,
               char* const* log_dirs, const char *resources_key,
               char* const* resources_values) {...}

В hadoop-2.2.0-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/target/native/CMakeFiles/test-container-executor.dir/link.txt:

/Library/Developer/CommandLineTools/usr/bin/cc  -g -Wall -O2 -D_GNU_SOURCE -D_REENTRANT -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/test-container-executor.dir/main/native/container-executor/test/test-container-executor.c.o  -o target/usr/local/bin/test-container-executor libcontainer.a 

Что касается сжатого файла hadoop-2.2.0-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/target/native/libcontainer.a, я обнаружил container-executor.c.o после распаковки, но не смог открыть его с проблемой кодировки.

Кроме того, ранее возникла ошибка при компиляции этого проекта:

 [exec] /Users/markdana/Downloads/hadoop-2.2.0-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.c:1252:48: error: too many arguments to function call, expected 4, have 5
 [exec]     if (mount("none", mount_path, "cgroup", 0, controller) == 0) {
 [exec]         ~~~~~                                  ^~~~~~~~~~
 [exec] /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/sys/mount.h:399:1: note: 'mount' declared here
 [exec] int     mount(const char *, const char *, int, void *);

Чтобы исправить это, я изменил объявление функции mount() в mount.h, чтобы:

int mount(const char *, const char *, const char *,int, const char *);

Это немного глупо, и я знаю это, но это работает по крайней мере. И тут возникла новая проблема, показанная в вопросе. Мне интересно, если они обеспокоены, или некоторые ошибки со связью библиотеки.

Проведя отладку в течение целого дня и не зная, что делать. Буду признателен, если вы укажете ключ или поделитесь каким-нибудь подобным опытом обработки проблем с связью cmake.

1 Ответ

0 голосов
/ 11 ноября 2018

Кажется, что функция fcloseall не существует в OS X. От Портирование приложений UNIX / Linux на OS X :

fcloseall

Эта функция является расширением fclose. Хотя OS X поддерживает fclose, fcloseall не поддерживается. Вы можете использовать fclose для реализации fcloseall, сохраняя указатели файлов в массиве и просматривая массив.

Вам необходимо изменить дизайн приложения и сохранить каждый файл, который должен быть закрыт с fcloseall. После этого вы можете использовать простой close для каждого такого файла, как указано в цитате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...