我有一个 Red Hat服务器x86_64 ,我正在尝试编译 CUDA GPU数据管理系统(GDBMS)。
已经设置了CUDA(7.5),并且 CUDAPATH 和 LD_LIBRARY_PATH 也正确地设置为相应的安装路径(已选中)。
我有以下Makefile:
-bash-4.1$ cat Makefile
# Micro test cases
TESTS = test_init_fini test_malloc test_cow test_memcpy test_memset \
test_launch test_ptarray test_evict_local
# Paths
CUDAPATH = /usr/local/cuda
MQXPATH := `pwd`/../../src
TMPPATH = ./tmp
# Compiler/linker settings
NVCC := $(CUDAPATH)/bin/nvcc
CFLAGS := -c --compiler-options -Wall -arch=sm_20 -I$(CUDAPATH)/include -I$(MQXPATH) -Xcompiler '-fPIC' -dc
LDFLAGS := -L$(CUDAPATH)/lib64 -L$(MQXPATH) -Xlinker -rpath=$(MQXPATH) -lmqx -Xcompiler '-fPIC' -dlink
.DEFAULT_GOAL := all
.SECONDEXPANSION:
.PHONY : all test setup cleanup $(TESTS)
TESTBINS := $(addprefix $(TMPPATH)/,$(TESTS))
all : $(TMPPATH) $(TESTBINS)
$(TMPPATH) :
@mkdir -p $(TMPPATH)
$(TESTBINS) : $$@.o
@./tcgen.py $<
@$(NVCC) $(CFLAGS) main.cu -o $(TMPPATH)/main.o
$(NVCC) $(LDFLAGS) $(TMPPATH)/main.o $< -o $@
-@rm $(TMPPATH)/main.o
$(TMPPATH)/%.o : %.cu
$(NVCC) $(CFLAGS) $< -o $@
# No rules for source files
%.c : ;
$(TESTS) : $(TMPPATH)/$$@
@echo "================================================================"
@LD_PRELOAD=$(MQXPATH)/libmqx.so $(TMPPATH)/$@
@echo ""
test : setup $(TESTS) cleanup
setup:
@$(MQXPATH)/mqxctl --start -v
@echo ""
cleanup:
@$(MQXPATH)/mqxctl --stop -v
clean:
-@rm $(TESTBINS) $(TMPPATH)/*.o testcases.h
-@rm -r $(TMPPATH)
如您所见,执行上述Makefile后, tmp / 目录中有一些生成的文件。这些文件是需要传递的一些测试,以便测试应用程序。编译成功但然后发生了一件非常奇怪的事情,我无法解释。 tmp / dir中生成的所有文件都是 NOT 可执行文件,因此无法完成测试阶段。
更具体地说,在运行make
并且编译成功后,我需要运行make test
才能运行测试。但是,我收到错误:
/bin/sh: ./tmp/test_init_fini: cannot execute binary file
make: *** [test_init_fini] Error 126
test_init_fini 是生成的文件之一,正如您所见,它不可执行。
-bash-4.1$ file *
test_cow: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_cow.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_evict_local: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_evict_local.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_init_fini: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_init_fini.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_launch: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_launch.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_malloc: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_malloc.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_memcpy: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_memcpy.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_memset: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_memset.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_ptarray: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
test_ptarray.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
毕竟,我的 Makefile 可能出错,无法生成可执行文件?我已经读过 GCC 中的 -c 标志可能会导致问题但是当我删除它时,我会得到相同的结果。
*请注意 Makefile 中的 mqxctl 文件是从上一阶段成功编译生成的,并且工作正常(选中)。
如果需要,我很乐意提供更多信息。 有什么想法吗? 非常感谢你的耐心等待。
[编辑]
更多信息: 所以,我试图尝试的初始GDBMS是MultiQx。 如果您快速查看 README 文件,您将看到他们已经创建了它并使用CUDA 5.0对其进行了测试,因此他们不保证它可以适用于较新版本。
&#34; 我们建议安装已知可用的CUDA SDK 5.0 libmqx。较新版本的CUDA SDK可能与libmqx存在一些链接问题&#34;
并且如前所述,我的服务器安装了CUDA 7.5(我不允许更改它)。
当我最初以默认形式尝试时,我在 tests / micro / 目录中运行make
时收到以下错误。 ( src / 文件夹中的make
最初成功了)
/usr/local/cuda/bin/nvcc -L/usr/local/cuda/lib64 -L`pwd`/../../src -Xlinker -rpath=`pwd`/../../src -lmqx ./tmp/main.o tmp/test_init_fini.o -o tmp/test_init_fini
/usr/bin/ld: tmp/test_init_fini: hidden symbol `cudaFreeHost' in /usr/local/cuda/lib64/libcudart_static.a(libcudart_static.a.o) is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
make: *** [tmp/test_init_fini] Error 1
因此,我开始在线查找错误的可能解决方案以解决问题 通过阅读其他帖子,我修改了我的Makefile(你可以在上面提供的链接中下载初始的Makefile,我刚刚添加了一些 cflags&amp; ldflags ),所以我实现了通过编译阶段。
然后,我在测试阶段陷入困境。
[第二次编辑]
据@RobertCrovela在评论中的回答我肯定要摆脱-dlink
旗帜,这是完全可以接受的。所以现在,我必须摆脱-dlink
标志,我专注于解决以下错误:
/usr/local/cuda/bin/nvcc -L/usr/local/cuda/lib64 -L`pwd`/../../src -Xlinker -rpath=`pwd`/../../src -lmqx ./tmp/main.o tmp/test_init_fini.o -o tmp/test_init_fini
/usr/bin/ld: tmp/test_init_fini: hidden symbol `cudaFreeHost' in /usr/local/cuda/lib64/libcudart_static.a(libcudart_static.a.o) is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
make: *** [tmp/test_init_fini] Error 1
为什么 cudaFreeHost 无法看到?