【问题标题】:Undefined reference to everything, when using libm使用 libm 时对所有内容的未定义引用
【发布时间】:2014-04-25 12:49:37
【问题描述】:

我有一个程序使用 C++ 中的标准数学函数。在我的 Mac 上,它使用 clang 链接得很好,甚至不用 -lm。但是,在 Ubuntu 上,也使用 clang,在我的命令行中添加 -lm 后,我得到了对一切的未定义引用。我的意思是字面上的一切。

我的 Makefile 如下所示:

CC = clang
CFLAGS = -fmessage-length=0 -std=c++11 -pipe
LDFLAGS = -pipe
LDLIBS = -lpng -lpthread -lm
OBJS = Colour.o GraphicsLibrary/SimpleVector.o Camera.o Ray.o \
Material.o SceneObject.o Sphere.o Plane.o Polygon.o PolygonPatch.o Cone.o \
Cylinder.o Light.o Scene.o SimpleScene.o BoxedScene.o RTreeScene.o AABB.o Main.o \
AFF/parse.o AFF/texture.o AFF/animation.o AFF/quat.o AFF/kbsplpos.o \
AFF/kbsplrot.o
TARGET = straylight


######################
# ------------------ #
# Top level targets. #
# ------------------ #
######################

all: ${TARGET}

clean:
    rm -v ${OBJS} ${TARGET}

debug:
    ${MAKE} EXTRA_C_FLAGS="-g3 -pg" EXTRA_LD_FLAGS="-g3 -pg"

optimized:
    ${MAKE} EXTRA_C_FLAGS="-O3" EXTRA_LD_FLAGS="-O3"

######################
# ------------------ #
# Low level targets. #
# ------------------ #
######################

${TARGET}: ${OBJS}
    ${CC} ${LDFLAGS} ${EXTRA_LD_FLAGS} -o ${TARGET} $^ ${LDLIBS} 

%.o: %.C %.h Makefile
    ${CC} ${CFLAGS} ${EXTRA_C_FLAGS} -c -o $@ $<

【问题讨论】:

  • 如果要编译 C++ 代码,请使用 C++ 编译器 :)
  • 我很困惑。问题最初标记为 C++,但 @sehe 将其更改为 C。使用的编译器是 clang (C) 而不是 clang++ (C++),但 CFLAGS 有 -std=c++11 并且 makefile 包含编译 %.C 的规则(注意大写 C,通常对于 C++)。我们在这里使用什么语言?
  • 请记住您正在使用的编译器/语言。现在你完全把事情搞混了。
  • @harmic 哇。谁将 .C 用于 c++!?!?!脑洞大开
  • 我正在尝试编译 C++。使用 CC = clang++ 解决了这个问题。没有意识到 C++ 有不同的可执行文件。谢谢

标签: c++ ubuntu clang libm


【解决方案1】:

根据 cmets,在编译 C++ 时,您需要使用正确的编译器。 clang++ 用于 C++。

C 和 C++ 编译器通常是相同的基本程序,但调用它们时例如。 clang 或 clang++ 使用目标语言的正确选项调用它们。

您看到的错误很可能是程序未链接到正确的运行时库的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-20
    • 2016-09-11
    • 2016-04-19
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    相关资源
    最近更新 更多