架构x86的未定义符号\u 64:“\u fcloseall”

ktca8awb  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(606)

我正在编译hadoop节点管理器。
编译环境: MacOS-10.14 , java-1.7.0_80 , cmake3.13.0-rc3clang-1000.10.44.4 , Maven 3.6.0 , protocbuf 2.5.0 .
我正在尝试安装 Hadoop-2.2.0 在macos上,但正如文件所示,
本机hadoop库仅在*nix平台上受支持。该库不需要与cygwin或macosx平台一起工作。
所以我必须重新编译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的编译器从 clanggcc ,但没有用。
与错误消息相关,我发现以下代码。
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链接问题的类似经验,我们将不胜感激。

agyaoht7

agyaoht71#

似乎这个函数 fcloseall 在OSX上不存在。从将unix/linux应用程序移植到os x: fcloseall 此函数是对 fclose . 尽管OSX支持 fclose , fcloseall 不支持。你可以用 fclose 实施 fcloseall 通过将文件指针存储在数组中并遍历数组。
您需要重新设计应用程序,并存储每个应该关闭的文件 fcloseall . 之后,你可以使用简单的 close 每一个这样的文件,如引文所述。

相关问题