【问题标题】:G++ Library Not Found未找到 G++ 库
【发布时间】:2020-04-16 18:56:37
【问题描述】:

我正在尝试编译我制作的 TBB 和 OpenMp 比较程序。它使用默认的 Visual Studio 编译器编译得很好。所以,我知道 TBB 安装正确。但是,我想改用 g++。我创建了一个 Makefile,从我读到的内容中需要 -ltbb 标志。

我的错误是,“c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: 找不到-ltbb”。

在确保我将所有内容正确链接并仍在努力学习方面,我不是专家。

这是我当前的 Makefile

CPLUSPLUS = g++ 
OPTFLAGS = -O3
TBB_INCLUDE_PATH = C:\tbb-2020.1-win\tbb\include
TBB_LIBRARY_PATH = C:\tbb\tbb\lib\intel64\vc14

all: pps

pps: avl.o main.o parPlaneSweep.o
    $(CPLUSPLUS) -I$(TBB_INCLUDE_PATH) -L$(TBB_LIBRARY_PATH) $(OPTFLAGS) -o $@ $^ -ltbb

avl.o: avl.h avl.c
    $(CC) -c $(OPTFLAGS) -fPIC avl.c

main.o: main.cpp parPlaneSweep.h
    $(CPLUSPLUS) -c $(OPTFLAGS) -fopenmp main.cpp 

parPlaneSweep.o: parPlaneSweep.h parPlaneSweep.cpp
    $(CPLUSPLUS) -c $(OPTFLAGS)  -fPIC -fopenmp parPlaneSweep.cpp

clean:
    rm *.o
    rm pps

【问题讨论】:

  • CPLUSPLUS = g++ -ITBB_INCLUDE_PATH -LTBB_LIBRARY_PATH 不是一个好主意。我会将-ITBB_INCLUDE_PATH-LTBB_LIBRARY_PATH 放在使用它们的规则中,而不是将它们放入通常用于命名编译器的变量中。这会将太多的责任集中到一个地方,也可能导致您的错误。
  • 您不会将库 (-ltbb) 添加到编译行(-c 创建目标文件的行)中。库仅添加在链接行中。
  • @user4581301 谢谢你们的帮助,我已经用你们的建议更新了我的makefile,但我仍然遇到同样的错误。 codepile.net/pile/lDwJ445v

标签: c++ makefile compiler-errors g++


【解决方案1】:

请更新您的问题,而不是指向其他网站。

首先,您永远不应该在 makefile 中使用反斜杠,即使在 Windows 上也是如此(在 Windows 上也有例外,但它们非常罕见)。始终使用正斜杠作为目录分隔符。

其次,您定义了变量TBB_INCLUDE_PATHTBB_LIBRARY_PATH,但是您从不使用它们。仅提及变量的 name 并不使用该变量。您必须将其包含在 $(...) 中才能使用它,例如 $(TBB_INCLUDE_PATH)

最后,所有常见的链接器都是单通道链接器,这意味着您将库和目标文件放在链接行的顺序至关重要。您应该始终将目标文件放在首先,而将库放在最后。如果您有多个库,那么它们出现的顺序可能也很重要。您的链接行应该是这样的:

pps: avl.o main.o parPlaneSweep.o
        $(CPLUSPLUS) -I$(TBB_INCLUDE_PATH) -L$(TBB_LIBRARY_PATH) $(OPTFLAGS) -o $@ $^ -ltbb

如果您想了解$@$^ 的含义,可以阅读automatic variables

【讨论】:

  • 很好的答案。可能值得添加一些关于或链接,如果你已经去了一个(如果我有的话,我自己放弃)$@$^ 正在做什么。对于外行来说,这是一种令人头疼的巫术。
  • 嗯。堆栈溢出 FTW:What do the makefile symbols $@ and $< mean?。为什么我什至先尝试了谷歌?
  • 再次感谢你们的帮助,我真的很感激。我已经用我拥有的当前 Makefile 更新了帖子。在阅读了链接的帖子后,我也理解了 $@ $^ 符号。但是,我在尝试链接时仍然遇到同样的错误。
  • 嗯,你的变量使用是错误的。在TBB_LIBRARY_PATH 的值中,你说-L&lt;path&gt;。然后在链接行中使用-L$(TBB_LIBRARY_PATH)。这意味着你实际得到的是-L-L&lt;path&gt;。从一个或另一个位置删除-L。我的建议是将其从 TBB_LIBRARY_PATH 变量中删除。
  • 在寻求帮助时,发布实际失败的命令行(在错误之前打印出来的链接行)非常有用。通过查看,您应该能够很容易地看到问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2016-08-10
  • 2019-11-15
  • 1970-01-01
  • 2016-01-28
  • 2012-11-01
  • 1970-01-01
相关资源
最近更新 更多