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

ar -rcs object_file_1.o object_file_2.o


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

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


是真的吗
如果是这样:
目标文件puchuu.o取决于libSDL.a
如何制作libpuchuu.a?
另一个解决方案?


聚苯乙烯

我做了一个简单的例子,并将其发布到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的未定义引用!

最佳答案

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

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

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

以我的经验,当我对一个陌生的东西犯错时,错误通常是一个愚蠢的错误,与我不熟悉的事物无关。但是因为我在未知地区工作,所以我会自动认为我对该地区的了解不足一定是过错的,而不是我做了愚蠢的事情。

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

而且,作为一个旁注,“未定义引用攻击您的控制台”的想法非常有趣,离奇,在尝试链接后,屏幕和键盘的图像留给了我。

关于c++ - g++静态库取决于动态库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3918643/

10-13 07:05