g ++静态库依赖于动态库

时间:2010-10-12 20:18:04

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

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

ar -rcs object_file_1.o object_file_2.o

但我无法将我的项目与libpuchuu.a联系起来! 未定义的引用会攻击我的控制台!

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

  1. 是真的吗?
  2. 如果是真的: 目标文件puchuu.o取决于libSDL.a 如何制作libpuchuu.a?
  3. 另一种解决方案?
  4. 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的未定义引用!

1 个答案:

答案 0 :(得分:2)

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

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

您需要使用lib.cpp包含namespace sdl { .... functions ... }中定义的函数,并且您的代码将链接得很好。

根据我的经验,当我犯了一些不熟悉的错误时,错误通常是一个非常愚蠢的错误,与我不熟悉的事情无关。但是因为我在不知名的领域工作,我自动认为我对领土缺乏了解,而不是我做了一些愚蠢的事情。

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

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