Linux Apps Tutorials - Herong's Tutorial Examples - v1.02, by Herong Yang
"g++ -shared" to Build Dynamic Library
This section provides a tutorial example on how to use 'g++ -shared' commands to compile your code and to build dynamic library file on Linux systems.
If you want to build your own dynamic library files, you need to do it with the "g++ -shared" command.
Here is what I did to build by first static library file: libMyDynamic.so:
1. Create a source code file, MyDynamic.cpp
herong$ cat MyDynamic.cpp // MyDynamic.cpp #include "iostream" void myDynamicFunc() { std::cout << "Running myDynamicFunc()..." << std::endl; }
2. Compile source code file, MyDynamic.cpp, into a dynamic library file:
herong$ g++ -shared -o libMyDynamic.so MyDynamic.cpp /usr/bin/ld: /tmp/ccG05g0J.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Nonrepresentable section on output
3. Re-compile it again with "-fPIC" option as suggested:
herong$ g++ -shared -fPIC -o libMyDynamic.so MyDynamic.cpp herong$ ls -l *MyDynamic* -rwxrwxr-x. 1 herong herong 8872 Apr 13 01:57 libMyDynamic.so -rw-rw-r--. 1 herong herong 120 Apr 13 01:53 MyDynamic.cpp
4. Create a calling program, MyDynamicTest.cpp:
herong$ cat MyDynamicTest.cpp // MyDynamicTest.cpp #include "iostream" extern void myDynamicFunc(); int main() { std::cout << "Calling myDynamicFunc()..." << std::endl; myDynamicFunc(); }
5. Link MyDynamicTest.cpp with libMyDynamic.so without giving location path:
herong$ g++ -lMyDynamic MyDynamicTest.cpp /usr/bin/ld: cannot find -lMyDynamic
6. Link MyDynamicTest.cpp with libMyDynamic.so with giving location path using the "g++ -L ..." option. I can also use the "LIBRARY_PATH" environment variable instead of "g++ -L ...".
herong$ g++ -L . -lMyDynamic MyDynamicTest.cpp herong$ ./a.out Calling myDynamicFunc()... Running myDynamicFunc()...
7. Logout and login to run the program again. I got an error as expected, because libMyDynamic.so is no longer loaded in the CPU, and the program loader has no idea where to find it.
herong$ ./a.out ./a.out: error while loading shared libraries: libMyDynamic.so: cannot open shared object file: No such file or directory
8. Run it again with LD_LIBRARY_PATH set to the dynamic library path:
herong$ export LD_LIBRARY_PATH=. herong$ ./a.out Calling myDynamicFunc()... Running myDynamicFunc()...
Cool. GCC C/C++ compiler is much easier to work with dynamic libraries than static libraries in Linux systems.
Table of Contents
Running Apache Web Server (httpd) on Linux Systems
Running PHP Scripts on Linux Systems
Running MySQL Database Server on Linux Systems
Running Python Scripts on Linux Systems
Conda - Environment and Package Manager
"g++ --verbose" - GCC Compiler Steps and Settings
"g++ -I..." and CPATH Environment Variable
"g++ -l..." to Link with Library Files
"g++ -c" and "ar src" to Build Static Library
►"g++ -shared" to Build Dynamic Library
"ldd" - Dynamic Library Dependency Checker
"make" - Manage Program Build Process