【问题标题】:how to link your project to a library of 64 bit in makefile如何将您的项目链接到 makefile 中的 64 位库
【发布时间】:2014-12-31 21:04:22
【问题描述】:

我是 makefile 的初学者开发人员,并且有一个包含 src 目录的项目。在 src 目录中有一些 .c 和 .h 文件,如下所示: file1.c、file2.c、main.c、header1.h 和 header2.c。 Main 依赖于 file2.c,而 file2.c 依赖于 file1.c。每个文件都应该链接到我拥有的非标准库和非标准包含目录。库目录和包含目录分别是/usr/lib/srr__lib/usr/bin/srr__bin。我写了两个makefile,一个在src目录,另一个在项目的根目录。 src makefile如下图:

 CC = gcc

 TARGETDIR_PR=GNU-amd64-Linux

 all: $(TARGETDIR_PR)/PR

 OBJS_PR =  \
    $(TARGETDIR_PR)/file1.o \
    $(TARGETDIR_PR)/file2.o \
    $(TARGETDIR_PR)/main.o

  AM_CPPFLAGS = \
    -DPACKAGE_LOCALE_DIR=\""$(localedir)"\" \
    -DPACKAGE_SRC_DIR=\""$(srcdir)"\" \
    -DPACKAGE_DATA_DIR=\""$(pkgdatadir)"\"

 AM_CFLAGS =\
       -g -I/usr/bin/srr__bin 

 bin_PROGRAMS = PR

PR_4_SOURCES = \
       file1.c \
       file2.c \
       main.c 

PR_LDFLAGS = 

 PR_LDADD = -L/usr/lib/srr__lib -lsrr__ml__sharedmem_4core -lprdependency -lsrrdsl___wrapper_library__ml -lsrrdynarray -lsrrdynarray_pic -lsrrhistogram -lsrrhistogram_pic -lsrrlistofarrays -lsrrlistofarrays_pic -lsrrmalloc -lsrrparam -lsrrparam_pic -lsrrqueue -lsrrqueue_pic -lvreo_wrapper_library

 $(TARGETDIR_PR)/PR: $(TARGETDIR_PR) $(OBJS_PR)
       $(LINK.c) $(AM_CFLAGS) $(AM_CPPFLAGS) -o $@ $(OBJS_PR) $(PR_LDADD)


 $(TARGETDIR_PR)/SeedVP.o: $(TARGETDIR_PR) SeedVP.c
        $(COMPILE.c) $(AM_CFLAGS) $(AM_CPPFLAGS) -o $@ file1.c

 $(TARGETDIR_PR)/Task.o: $(TARGETDIR_PR) Task.c
        $(COMPILE.c) $(AM_CFLAGS) $(AM_CPPFLAGS) -o $@ file2.c

 $(TARGETDIR_PR)/main.o: $(TARGETDIR_PR) main.c
        $(COMPILE.c) $(AM_CFLAGS) $(AM_CPPFLAGS) -o $@ main.c

 clean:
    rm -f \
        $(TARGETDIR_PR)/PR \
        $(TARGETDIR_PR)/file1.o \
        $(TARGETDIR_PR)/file2.o \
        $(TARGETDIR_PR)/main.o
    rm -f -r $(TARGETDIR_PR)


  # Create the target directory (if needed)
 $(TARGETDIR_PR):
       mkdir -p $(TARGETDIR_PR)

  # Enable dependency checking
    .KEEP_STATE:
    .KEEP_STATE_FILE:.make.state.GNU-amd64-Linux

根目录的makefile如下图:

SUBDIRS = src

 PRDSL_4docdir = ${prefix}/doc/PR
  PRdoc_DATA = \
  README\
  COPYING\
  AUTHORS\
  ChangeLog\
  INSTALL\
  NEWS


INTLTOOL_FILES = intltool-extract.in \
  intltool-merge.in \
  intltool-update.in

EXTRA_DIST = $(PRdoc_DATA) \
  $(INTLTOOL_FILES)

DISTCLEANFILES = intltool-extract \
intltool-merge \
intltool-update \
po/.intltool-merge-cache


# Remove doc directory on uninstall
 uninstall-local:
   -rm -r $(PRdocdir)

我成功运行了所有 autotools 命令,然后 ./configure 然后 make 并且项目没有抱怨; make 没有错误,但是当我将生成的可执行文件作为 ./PR 运行时,它会抱怨并给出以下错误:

加载共享库时出错:libsrr__ml__sharedmem_4core.so: 无法打开共享对象文件:没有这样的文件或目录

我认为这可能是链接错误,因为库是 64 位的,而我的机器也是 64 位的。但是,我怎么能在makefile中提到这个呢?任何帮助将不胜感激。

【问题讨论】:

    标签: linux makefile 64-bit shared-libraries library-path


    【解决方案1】:

    运行程序时这样运行

    export LD_LIBRARY_PATH=/usr/lib/srr__lib
    ./executable_file
    

    或编辑/etc/ld.so.conf 并添加该行

    /usr/lib/srr__lib
    

    并以 root 身份运行 ldconfig

    【讨论】:

    • 是的,你是对的 :) 它适用于我,我尝试了第一个选项
    • LD_LIBRARY_PATH 是一个临时解决方案。编辑ld.so.conf 是一个系统范围的解决方案。第三种选择是在构建的二进制文件中使用rpath
    猜你喜欢
    • 2015-04-30
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2023-03-11
    • 2011-08-31
    相关资源
    最近更新 更多