Linux和Windows下C++代码编译的⼀些基本区别
从Windows Visual Studio开发迁移到Linux GCC开发的⼈们,经常会遇到⼀些奇怪的问题,因为在Linux上⾯的⼀些⾏为和Windows不同,当⼈们习惯了Windows的⾏为以后,往往不会想到这些不同的地⽅。
在这⾥,我把Linux下gcc编译和Windows下VC编译不同的地⽅列出来,⽅便⼤家避开坑。
编译程序
Windows 下VC编译C++ 程序使⽤ cl.exe,链接程序使⽤
Linux 下GCC编译C++ 程序使⽤ g++,并会链接程序,⽆需单独再调⽤链接程序。
另外GCC还有⼀个程序名叫gcc, g++ 相当于 gcc -xc++ -lstdc++ -shared-libgcc
依赖库名字
link 时,Windows下⾯要指定完整的lib的名称,⽽linux默认静态库的名字为libXXX.a,动态库为libXXX.so,因此在链接时,只需加选项-lXXX即可。
如果Linux下⾯的动态库不符合这⼀命名规则,如test.so,则需要选项 -Wl,test.so
库依赖顺序
linux下gcc编译的四个步骤在Linux下,gcc命令⾏的链接外部库选项,如-lXXX的位置会影响链接结果。链接器按照指定的顺序搜索和处理库和对象⽂件。因此,如果命令⾏如foo.o -lz bar.o,连接器将在⽂件foo.o之后、bar.o之前搜索库z。如果bar.o引⽤z中的函数,则可能不会加载这些函数。编译错误显⽰为未定义的符号。
⽣成动态库
在Linux下gcc编译动态库时,需要使⽤-fPIC选项⽀持⽣成位置独⽴代码(PIC),才可以被可执⾏⽂件在运⾏时加载到适当的位置,否则可能因为⽆法加载⽽失败。
运⾏时动态库路径
通常,在Windows下,只要把exe⽂件⽤到的dll⽂件放在同⼀个⽬录,即可正常运⾏。⽆需放到PATH环境变量指定的⽬录下。因为Windows⾸先在exe⽂件所在⽬录查dll,具体规则可以参考,更详细的规则参考。
Linux 引⼊了⼀个 rpath 的概念,即run-time search path。它规定了可执⾏⽂件在寻.so⽂件时的优先路径。可以参考。
在gcc编译时,可以通过选项-Wl,-rpath=.指定到和可执⾏⽂件相同⽬录,或者-Wl,-rpath=./lib指定到其他⽬录如可执⾏⽂件所在⽬录下的lib ⽬录。
rpath也可以在编译后⽤chrpath⼯具修改,详情见。
在Windows下,可以通过 程序查看⼀个可执⾏⽂件依赖的库。对应于Linux,可以使⽤ ldd命令。
===============
其他细节想到以后,再补充。也欢迎⼤家留⾔补充。谢谢!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论