【问题标题】:g++ static library depends on dynamic librariesg++静态库依赖动态库
【发布时间】:2010-10-12 20:18:03
【问题描述】:

我有一些静态库。例如 libpuchuu.a 它取决于动态库。例如 libSDL.so (但当然我有 libSDL.a) 创建 libpuchuu.a 很简单:

ar -rcs object_file_1.o object_file_2.o

但我无法将我的项目与 libpuchuu.a 链接! 未定义的引用攻击我的控制台!

在某个论坛我发现了这样一句话: 静态库的所有依赖都在这个库中 如果你的目标文件依赖于 y.a 你必须 unpack(ar) y.a 目标文件 到您的文件夹,然后将所有对象打包到新库中。问题:

  1. 是真的吗?
  2. 如果是真的: 目标文件 puchuu.o 依赖于 libSDL.a 如何制作 libpuchuu.a?
  3. 另一种解决方案?

PS

我做了一个简单的例子,贴到pastebin:

http://paste.lisp.org/display/115456

构建命令:

g++ -O3 -c index.cpp -I/usr/local/include/SDL
g++ -O3 -c lib.cpp -I/usr/local/include/SDL
ar rv libpuchuu.a lib.o
g++ -O3 -o program.exe index.o -L/usr/local/lib -lmingw32 -lSDLmain -lSDL -mwindows -lSDL_image -L. -lpuchuu

... 来自 index.cpp 的未定义引用!

【问题讨论】:

  • 您应该详细说明会出现哪些未定义的引用。这可能会导致共享对象丢失。
  • 能否请您将其包含为文本而不是图像?
  • 哦,伙计,那里有一个关于 sdldraw 的俄罗斯警告! (那应该很糟糕!):)
  • 我认为我无法打开 7z 文件。
  • 是的,我来自白俄罗斯。但所有的钱都在我们身上。我们应该试着写和说英语! ^_w_^

标签: c++ c build mingw gnu-make


【解决方案1】:

您是否尝试将-lSDL 添加到链接器的命令行中?

未定义的引用指向您尝试在lib.cpp 中定义的符号,您使用ar 将其打包在libpuchuu.a 中。不幸的是,您没有定义您认为您正在定义的符号。 using namespace sdl; 不会自动导致您定义的所有内容都在 sdl 命名空间中。它所做的只是安排它,以便当编译器查找特定名称时,它会在 sdl 命名空间以及主命名空间中查找它。

您需要将lib.cpp 中定义的函数用namespace sdl { .... functions ... } 包装起来,您的代码将可以正常链接。

根据我的经验,当我在不熟悉的事情上犯错时,这个错误通常是一个非常愚蠢的错误,与我不熟悉的事情无关。但因为我在未知领域工作,我自然而然地认为我对领域知识的缺乏一定是有错的,而不是我做了什么愚蠢的事情。

您可能会发现我的经验适用。

而且,作为旁注,“未定义的引用攻击您的控制台”的想法相当奇怪,并且在您尝试链接后给我留下了您的屏幕和键盘在冒烟的废墟中留下的图像。

【讨论】:

  • 当然。但未定义的引用攻击!
  • @puchu - 添加-lSDL 应该可以解决您的问题。如果您提供有关您正在运行的确切命令的更多详细信息,则可能会发现实际问题,并畏缩在它的藏身之处。
  • >>未定义的引用指向您在 lib.cpp 中定义的符号。如您所见,答案是如何解决。就写吧……
猜你喜欢
  • 2010-10-22
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多