添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

继续在后面添加,-Ldir表示添加库目录,-lxxx表示链接时使用名字为libxxx.so(libxxx.a)的库。(是小写的L,不是大写的I)。由于linux里库的命名格式都是libxxx.y所以省略前三个字母lib。链接时优先使用动态链接库,所以这里最后一个参数会变成libboost_filesystem-mt.so。如果要用静态库则增加-static。
关于库还有一些注意事项。
-l还有另一种写法比如-l:libcryptopp.a,这个明确指明要用哪个库,这种写法要更加健壮。
库的链接应该放在.o文件的后面,不然会出现undefined reference to XXX。这与g++执行的link order有关系。严格来说,库链接应该出现在用到库符号的项的后面。
编译库和编译程序的重要选项应该一致,不然可能link不了,比如编译器版本应该一样。

五、更多编译选项

-Dmacro表示#define macro
-O表示优化,-O3是最高级别优化,但是GCC建议一般用O2为好。
https://gcc.gnu.org/onlinedocs/gnat_ugn/Optimization-Levels.html

另外一个要注意的地方是debug和release
使用makefile得到的成果本质上没有debug和release之分。为什么呢?
因为成果已经是二进制了,不存在调试的问题。于是debug和release的区别就是是否进行了优化。一般在makefile中使用-O2来指示优化级别。所以得到的输出可以认为就是release版。
在引用库的时候只要引用即可,不用管到底是debug还是release
那么问题是windows下为什么存在debug和release?除了优化外,更重要的是因为VS允许进入库源代码中打断点进行调试,这样一来必须为库区分版本,不然无法做到。而Xcode应该是不允许这样的,所以也就无所谓库的版本的。
当然Xcode的项目还是区分debug和release的,这是因为项目本身的代码可以调试并优化。

还可以手动增加其他不常用的选项。具体见编译器文档。

假设这里使用asio coroutine写了一个服务器,那么makefile就需要这么写
(注,这里是在MacOS上使用Xcode的编译写法,放在g++上写法不一样,见ASIO协程专题)

Contact

If you have some questions in mind about the topics on this site, or want to share something, feel free to write to me via [email protected]. But have patience since I only check my mail once in a while 🙂