Compiling C++ into portable linux binaries

青春壹個敷衍的年華 提交于 2019-12-21 03:53:14

问题


Ok, this question is about portable as in no dependencies (i.e. "I can put the binaries in a USB key and bring it with me everywhere, e-mail them to friends etc").

I have heard of static linking but I'm confused to what are exactly the consequences of it; what can and what can't be static linked (i.e. what about Qt, OpenGL, libstdc++?) and to which degree the binary will be "portable" afterwards.

I've also heard of LSB (Linux Standard Base) but I don't know exactly what it is or if it can help in this sense.


回答1:


Static linking works for most libraries, but not those that use dynamically loaded modules. Just try and see if it works. You may still have issues with kernel compatibility; your program may be using system calls not available in older kernels.

The Linux Standard Base is supported by some Linux distros, but on Debian (and I think also Ubuntu) it has to be installed from a package. It also handles mostly administrative things like startup scripts, though it has some binary compatibility stuff. See this page for some info.

For the "put on USB key and run anywhere" requirement, check out CDE.




回答2:


You don't have to link all of the libraries the same way. I'd definitely stick with dynamic linking for libc and the other system libraries. And use static linking for anything C++; the binary API does change from time to time, and you need to be sure that the version of the library is the same as the version you compiled against---the surest way of doing that is to statically link the library into your executable. If any of the other libraries you use are written in C++, you'll probably want to compile them locally as well, rather than using a precompiled distribution, to ensure that they are compiled against the same binary API, and link them statically. The binary API for C is fixed, so you have more freedom: if the library is going to be present on every installation, and must have a version compatible with the version of the OS, link dynamically; otherwise, statically.




回答3:


Be careful with static linking using gcc, it does not really work any more. See




回答4:


To disappoint you: there is no solution to it. That statically link is there, and you can (if you want) link everything static => all dependencies from other libraries are removed. But there are other dependencies, which cant be avoided: First there is the architecture. We have here linux on PowerPC, linux on ARM, linux on Microblaze, linux on 32-bit x86, and linux on 64-bit x86. Secondly there is the the ABI and there syscalls. Those can (and indeed have in the past) change (e.g. exotic/new syscalls does not exist on old systems - and if you got those calls in your binary your program wont work).

The LSB is just a a standard (or better it tries to be - not everyone follows it) for the different distros to make adminstration, usage, and maintaining (and sometimes developing) easier by e.g. defining where which files are stored. It does not aim to make executables more portable.



来源:https://stackoverflow.com/questions/5563906/compiling-c-into-portable-linux-binaries

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!