无法通过gcc

时间:2016-10-06 23:51:50

标签: c linux gcc makefile cuda

我有一个 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 无法看到?

0 个答案:

没有答案