【问题标题】:makefile error: /usr/bin/ld: cannot find -llibname and makedependmakefile 错误:/usr/bin/ld: 找不到 -llibname 和 makedepend
【发布时间】:2015-02-23 21:48:28
【问题描述】:

我正在尝试为小型项目编写自己的 makefile,我的项目由 src 目录组成,其中包含 main.c、file1.c、file2.c、header1.h,最后是 header2.h 这些文件使用了一些库我创建的非标准库目录和非标准头文件,库目录位于 usr/lib/pr__lib 和头目录位于 usr/include/lib 所以我应该创建两个makefile.am,一个位于src目录,另一个位于项目的根目录,src目录的makefile.am如下所示:

program_NAME := myproject

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


bin_PROGRAMS = myproject_AutoProject

program_INCLUDE_DIRS := /usr/bin/srr__bin

program_LIBRARY_DIRS := /usr/lib/srr__lib

AM_CFLAGS = 

AM_CFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))

program_lib2 := \
      libsrr\
      libprdsl \
      libtwo \
      libhistogram \
      libhistogram_pic \
      libprlistofarrays \
      libprlistofarrays_pic \
      libprmalloc \
      libvreo 
AM_LDFLAGS = 

AM_LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))

AM_LDFLAGS += $(foreach library,$(program_lib2),-l$(library))

PRDSL_AutoProject_SOURCES = \
   main.c \
   file1.c \
   file2.c

depend :
    makedepend -$(CFLAGS) -$(PRDSL_AutoProject_SOURCES)

all: $(program_NAME)

第二个makefile.am如下图:

SUBDIRS = src

myproject_AutoProjectdocdir = ${prefix}/doc/PRDSL_AutoProject
myproject_AutoProjectdoc_DATA = \
  README\
  COPYING\
  AUTHORS\
  ChangeLog\
  INSTALL\
  NEWS


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

EXTRA_DIST = $(myproject_AutoProjectdoc_DATA) \
   $(INTLTOOL_FILES)

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


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

但我收到以下错误:

 /usr/bin/ld: cannot find -llibsrr
 /usr/bin/ld:.......

其余的库也一样! 我猜这里是depend命令的问题,谁能告诉我如何使用depend命令来自动创建依赖并避免人为错误

【问题讨论】:

  • 这是确切的错误信息吗?你使用-lsrr 链接libsrr.so/libsrr.a 库。
  • 一些库是 .a 静态的,另一个是 .so 动态的>
  • .a.so 通常对 -l 无关紧要。这个名字可以。从所有这些名称中删除 lib 前缀。
  • @EtanReisner 非常感谢 :) 你是 makefile 英雄,错误已解决,但它抱怨一个与依赖 make[2] 相关的新错误:*** 没有规则来制作目标 myproject', needed by 全部'。停止。
  • 您的depend 配方仍然不太正确,但这又可能不相关。使用最新的 makefile 和新的错误消息提交一个新问题。

标签: c linux makefile dependencies


【解决方案1】:

您能否进行此更改并告诉我:

PathToMySource=`pwd` 
Program_INCLUDE_DIRS := /usr/bin/srr__bin

program_LIBRARY_DIRS := /usr/lib/srr__lib

AM_CFLAGS = 

AM_CFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))

program_lib2 := \
      $(PathToMySource)/libsrr\
      $(PathToMySource)/libprdsl \
      $(PathToMySource)/libtwo \
      $(PathToMySource)/libhistogram \
      $(PathToMySource)/libhistogram_pic \
      $(PathToMySource)/libprlistofarrays \
      $(PathToMySource)/libprlistofarrays_pic \
      $(PathToMySource)/libprmalloc \
      $(PathToMySource)/libvreo 
AM_LDFLAGS = 

AM_LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))

AM_LDFLAGS += $(foreach library,$(program_lib2),-l$(library))

PRDSL_AutoProject_SOURCES = \
   main.c \
   file1.c \
   file2.c

depend :
    makedepend -$(CFLAGS) -$(PRDSL_AutoProject_SOURCES)

all: $(program_NAME)

我假设这些文件夹位于 make 文件预期运行的目录中。

如果不是,请添加另一个变量并设置路径。然后使用该变量代替 PathToMySource。

希望这会有所帮助。

【讨论】:

  • @genesh 我会检查一下,但我尝试了上面 cmets 中建议的解决方案,即从库名称中删除 lib 前缀,它对我有用,但给了我一个我猜的新错误它与 target 和 makedepend 相关 make[2]: *** No rule to make target myproject',所有人都需要'。停止
  • 哦,很抱歉,我复制回来时出错了。我已经把它加回来了。
  • @Sara,仅通过查看 make 文件内容,我们可以看到的有限数据很难判断。
猜你喜欢
  • 1970-01-01
  • 2021-05-07
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2014-07-09
  • 1970-01-01
相关资源
最近更新 更多