【问题标题】:How to do a Makefile using a specific libraries in different paths?如何使用不同路径中的特定库来生成 Makefile?
【发布时间】:2023-03-31 17:51:01
【问题描述】:

我遇到的问题是我需要使用位于不同路径位置的特定库来编译我的代码。我需要使用 ./ramdisk/libs 路径中的 -lncurses 库,问题是该目录还包含我不想链接的 lthr 库版本。 makefile 将两个库从同一位置拉出,这不是我想要的。我无法更改文件系统中这些库目录的内容,因此我需要找到一种方法来告诉 Makefile 从路径 A 链接 lncurses 库并从路径 B 链接 lthr 库,而不是使用路径 A 中的 lthr。

有什么建议吗?

CC=icc
NCE=-L./ramdisk/libs
CFLAGS+=-I$(ROOTDIR)/../../include
#LDFLAGS=-static -lthr 

$(DESTDIR)/nce: nce
        mkdir -p $(DESTDIR)
        $(INSTALL) -m 777 nce $(DESTDIR) 

nce: nce.c 
        $(CC) $(CFLAGS) nce.c $(LDFLAGS) -o nce -lthr $(NCE) -lncurses

【问题讨论】:

  • 这是链接器问题,而不是生成文件问题。检查 icc 文档。

标签: makefile


【解决方案1】:

您可以(可能)通过提供库存档的完整路径来绕过搜索。因此,您可以尝试./ramdisk/libs/libncurses.a(或其他),而不是指定-lncurses。您没有指定它是否是共享库,我不完全确定这是否适用于共享库,但可能值得一试。

[编辑]

由于这是一个共享库问题,可能类似于:

CC=icc
THR=/full/path/to/wherever/libthr/lives
NCE=/full/path/to/ramdisk/libs
CFLAGS+=-I$(ROOTDIR)/../../include
LDFLAGS=-static

nce: nce.c
    $(CC) $(CFLAGS) nce.c $(LDFLAGS) -o nce -L$(THR) -W,-rpath=$(THR) -lthr -L$(NCE) -W,-rpath=$(NCE) -lncurses

由于我不熟悉 icc,所以我在这里有点摸不着头脑,但我的想法是确保链接器将 thr 的路径放在运行时链接器的搜索路径上之前在 ramdisk 上,以便首先找到 thr。

【讨论】:

  • 这是问题的一个非常相关的方面。共享库的路径主要在运行时解析。 (并且可以使用LD_LIBRARY_PATH 影响)。正如 Beta 所建议的,这是一个链接器问题,而不是 Makefile 问题。
  • 所以我尝试了这个,NCE=-L./../../ramdisk/lib/libncursesw.so.7 $(CC) $(CFLAGS) nce.c $(LDFLAGS) -o nce -lthr $(NCE) 它不起作用我对 lncurses 库的引用没有链接,nce.c:(.text+0x729): undefined reference to `initscr' :(
  • @Oliver:不要在那里使用-L。这指定了要搜索库的目录。把它直接放在那里,就像NCE=./../../ramdisk/lib/libncursesw.so.7 一样。.so 表示这是一个共享库,所以无论如何这可能无法正常工作。我将编辑我的答案并添加您可能会尝试的其他内容...
  • 感谢大家的建议,终于可以解决这个问题了。感谢 kwatford 的建议,我删除了 -L 并指向 libncurses.a(.so.7 错误),它编译和链接时没有任何警告/错误。我真的很感谢你花时间阅读我的帖子:)
  • @Oliver:很高兴听到。不要忘记将问题标记为已回答;)
【解决方案2】:

您可以将远程库复制到本地工作目录。

ncurses 来自一个位置,而 thr 来自另一个位置。

【讨论】:

    猜你喜欢
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多