静态库要按顺序排列
比如main.c中包含了func.h头文件,而func.c被做成了libfunc.a静态库,那么编译时就必须按顺序排列main.c和libfunc.a:
gcc main.c libfunc.a -o main
否则就会报undefined reference错误
同理,如果静态库没有打包完整,静态库中目标文件还包含其他未被打包进来的库,那么在包含静态库后,还需要包含库文件
比如main.c包含func.h头文件,func.c包含test.h头文件,只将func.o打包成libfunc.a,那么就需要这样编译:
gcc main.c libfunc.a test.c -o main
参考顺序
作为一个经验法则,当编写链接器命令时,我会按照以下顺序使用:
目标文件(*.o)
静态库(*.a)
共享库(*.so)
这可能是Debian系独有的问题
下面来自练习29:库和链接-笨办法学C(Learn C The Hard Way) (cntofu.com)
有时候你像往常一样运行cc -Wall -g -DNDEBUG -ldl ex29.c -o ex29,并且认为它能够正常工作,但是没有。在一些平台上,参数的顺序会影响到它是否生效,这也没什么理由。在Debian或者Ubuntu中你需要执行cc -Wall -g -DNDEBUG ex29.c -ldl -o ex29,这是唯一的方式。所以虽然我在这里使用了OSX,但是以后如果你链接动态库的时候它找不到某个函数,要试着自己解决问题。
这里面比较麻烦的事情是,实际平台的不同会影响到命令参数的顺序。将-ldl放到某个位置没有理由与其它位置不同。它只是一个选项,还需要了解这些简直是太气人了。
💡 所以链接动态库时,一样要注意顺序(在Debian系上)