【g++】命令动态链接 和静态链接
一、动态链接
在 g++ 命令中,使用 -l
选项可以将指定的库文件链接到生成的可执行文件中。如果库是动态链接库(.so 文件),则使用 -l
选项时不需要指定库文件的扩展名。
例如,假设有一个名为 libfoo.so
的动态链接库,要在链接时使用它,可以执行以下命令:
g++ -o myprog myprog.cpp -lfoo
这里的 -lfoo
表示链接名为 libfoo.so
的库文件。
另外,还可以使用 -L
选项指定库文件的搜索路径。例如,如果 libfoo.so
库文件位于 /path/to/lib
目录下,则可以使用以下命令:
g++ -o myprog myprog.cpp -L/path/to/lib -lfoo
这里的 -L/path/to/lib
表示在 /path/to/lib
目录下搜索库文件。
需要注意的是,如果程序运行时找不到动态链接库,则会出现运行时错误。因此,在使用动态链接库时,应该确保库文件的路径正确,并且在运行程序时将库文件的路径包含在 LD_LIBRARY_PATH
环境变量中。
基于命令查看可执行文件都有哪些动态链接,可以使用ldd命令
命令格式:ldd 可执行文件名
Idd 【可执行文件名】 linux-vdso.so.1 (0x00007ffd63bcb000) /$LIB/libonion.so => /lib64/libonion.so (0x00007fbe556a8000) libdb-5.3. so => /lib64/Libdb-5.3.so (0x00007fbe554da000) libpthread.so.0 => /lib64/Libpthread.so.0 (0x00007fbe55264000) libm.so.6 => /lib64/Libm.so.6 (0x00007fbe54ee2000) libtcmalloc.so.4 => /lib64/Libtcmalloc.so.4 (0x00007fbe54ae6000) libc.so.6 => /lib64/libc.so.6 (0x00007fbe54710000) libdl. so.2 => /11b64/libdl.so.2 (0x00007fbe5450c000) libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007fbe5401a000) /lib64/1d-linux-x86-64.50.2 (0x00007fbe55484000) libunwind.so.8 => /lib64/libunwind.so.8 (0x00007fbe53e02000) libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fbe53a6d000) libgcc_s. so.1 => /lib64/libgcc_s.So.1 (0x00007fbe53855000) libz.so.1 => /lib64/libz.so.1 (0x00007fbe5363d000)
二、静态链接
在 g++ 命令中,使用 -static
选项可以将指定的库文件静态链接到生成的可执行文件中。静态链接库(.a 文件)会直接被嵌入到可执行文件中,这样程序运行时不需要额外的库文件。
例如,假设有一个名为 libfoo.a
的静态链接库,要在链接时使用它,可以执行以下命令:
g++ -o myprog myprog.cpp -static -lfoo
这里的 -static
表示进行静态链接,-lfoo
表示链接名为 libfoo.a
的库文件。
另外,与动态链接库类似,可以使用 -L
选项指定库文件的搜索路径。例如,如果 libfoo.a
库文件位于 /path/to/lib
目录下,则可以使用以下命令:
g++ -o myprog myproc.cpp -L/path/to/lib -static -lfoo
这里的 -L/path/to/lib
表示在 /path/to/lib
目录下搜索库文件。
需要注意的是,静态链接会导致生成的可执行文件体积较大,但是程序运行时不需要额外的库文件。而动态链接则会使生成的可执行文件体积较小,但在程序运行时需要确保相应的动态链接库可用。