我有一些静态库。例如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/