2010-10-12 105 views
0

我有一些静态库。例如libpuchuu.a 它取决于动态库。例如libSDL.so (五言,但我有libSDL.a) 创作libpuchuu.a的很简单:g ++静态库依赖于动态库

ar -rcs object_file_1.o object_file_2.o 

但我不能libpuchuu.a链接到我的项目! 未定义的引用攻击我的控制台!

在一些论坛上,我已经发现了这样一句话: 静态库的所有依赖关系是在该库 如果你的目标文件依赖于雅,你必须解压(AR)雅对象文件 到您的文件夹,然后收拾所有对象你的新图书馆。问题:

  1. 它是真的吗?
  2. 如果它是真的: 对象文件puchuu.o取决于libSDL.a 如何使libpuchuu.a?
  3. 另一种解决方案?

PS

我做了一个简单的例子,并张贴到引擎收录:

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 

...从指数 未定义的引用的.cpp!

+1

您应该详细说明未定义的引用出现的位置。这可能会导致共享对象丢失。 – 2010-10-12 20:23:24

+0

你能否把它作为文字而不是图像? – Omnifarious 2010-10-12 20:25:34

+0

哦,男人,有关于sdldraw的俄罗斯警告! (这应该是坏的!):) – 2010-10-12 20:29:55

回答

2

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

未定义的参考符号是您尝试在lib.cpp中定义的符号,您使用ar将其封装在libpuchuu.a中。不幸的是,你没有定义你认为你定义的符号。 using namespace sdl;不会自动导致您定义的所有内容位于sdl名称空间中。它所做的一切就是安排它,以便在编译器查找特定名称时,它会在sdl名称空间中与主命名空间一起查找它。

您需要将lib.cpp中定义的函数与namespace sdl { .... functions ... }包装起来,并且您的代码将很好地链接。

根据我的经验,当我用一些不熟悉的东西犯了一个错误时,错误通常是一个非常愚蠢的错误,与我不熟悉的东西无关。但是因为我在未知领域工作,我自动假设我缺乏对领土的认识必须有过错,而不是我做了一些愚蠢的事情。

你可能会发现我的经验适用。作为一个便笺,'未定义的引用攻击你的控制台'的想法是相当有趣的奇怪,并留下你的屏幕和键盘的图像留在吸烟的废墟中,你尝试链接后。

+0

的cource。但未定义的引用攻击! – puchu 2010-10-12 20:21:26

+0

@puchu - 添加'-lSDL'应该可以解决您的问题。如果您提供更多关于您正在运行的确切命令的详细信息,那么实际问题可能会被揭露,并且隐藏在其藏身的地方。 – Omnifarious 2010-10-12 20:23:42

+0

>>未定义的引用是你在lib.cpp中定义的符号。正如你看到的答案是如何解决它。只是写... – puchu 2010-10-12 20:46:36