【发布时间】:2020-03-30 20:45:20
【问题描述】:
我正在为 Linux Debian 10 上的 IUP 图形工具包编译 example。我下载了示例并将其保存在 main.c 下。如您所见,如果您按照链接 #include 预处理器指令如下所示:
#include <stdlib.h>
#include <stdio.h>
#include <iup.h>
我写了一个makefile,用于创建动态链接的可执行文件或静态链接的可执行文件:
#############################################################################################################
dynamic:
gcc -liup -o dynamic.elf main.c
#############################################################################################################
static: static.o
ld -e main -o static.elf static.o \
-l:libiup.a \
-lgtk-3 \
-lgdk-3 \
-lpangocairo-1.0 \
-lX11 \
-lcairo \
-lgdk_pixbuf-2.0 \
-lm \
-lpango-1.0 \
-lgobject-2.0 \
-lglib-2.0 \
-lpthread \
-lc
static.o: main.c
gcc -c -Wall -Wpedantic -o static.o main.c
#############################################################################################################
现在,如果我使用make dynamic 运行 make,可执行文件将被编译并且它可以正常工作。它链接到许多共享库:
ziga@ziga-laptop:2020-03-26--example-a$ ldd dynamic.elf
linux-vdso.so.1 (0x00007ffd413cf000)
libiup.so => /lib/libiup.so (0x00007f4ecb4be000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4ecb2fd000)
libgtk-3.so.0 => /lib/x86_64-linux-gnu/libgtk-3.so.0 (0x00007f4ecac0c000)
libgdk-3.so.0 => /lib/x86_64-linux-gnu/libgdk-3.so.0 (0x00007f4ecab10000)
libpangocairo-1.0.so.0 => /lib/x86_64-linux-gnu/libpangocairo-1.0.so.0 (0x00007f4ecab00000)
libcairo.so.2 => /lib/x86_64-linux-gnu/libcairo.so.2 (0x00007f4eca9e0000)
libgdk_pixbuf-2.0.so.0 => /lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007f4eca9b8000)
libpango-1.0.so.0 => /lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007f4eca96d000)
libgobject-2.0.so.0 => /lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f4eca918000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f4eca7f9000)
libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007f4eca6b8000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4eca535000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4ecb85f000)
libgmodule-2.0.so.0 => /lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f4eca52d000)
libXi.so.6 => /lib/x86_64-linux-gnu/libXi.so.6 (0x00007f4eca31d000)
libXcomposite.so.1 => /lib/x86_64-linux-gnu/libXcomposite.so.1 (0x00007f4eca11a000)
libXdamage.so.1 => /lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f4eca115000)
libXfixes.so.3 => /lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f4ec9f0f000)
libcairo-gobject.so.2 => /lib/x86_64-linux-gnu/libcairo-gobject.so.2 (0x00007f4ec9f03000)
libatk-1.0.so.0 => /lib/x86_64-linux-gnu/libatk-1.0.so.0 (0x00007f4ec9ed8000)
libatk-bridge-2.0.so.0 => /lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0 (0x00007f4ec9ea3000)
libxkbcommon.so.0 => /lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007f4ec9e61000)
libwayland-cursor.so.0 => /lib/x86_64-linux-gnu/libwayland-cursor.so.0 (0x00007f4ec9e57000)
libwayland-egl.so.1 => /lib/x86_64-linux-gnu/libwayland-egl.so.1 (0x00007f4ec9e52000)
libwayland-client.so.0 => /lib/x86_64-linux-gnu/libwayland-client.so.0 (0x00007f4ec9e41000)
libepoxy.so.0 => /lib/x86_64-linux-gnu/libepoxy.so.0 (0x00007f4ec9d0d000)
libgio-2.0.so.0 => /lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007f4ec9b4f000)
libharfbuzz.so.0 => /lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f4ec9a54000)
libpangoft2-1.0.so.0 => /lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 (0x00007f4ec9a3b000)
libfontconfig.so.1 => /lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f4ec99f5000)
libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f4ec9939000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4ec9916000)
libXinerama.so.1 => /lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007f4ec9911000)
libXrandr.so.2 => /lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007f4ec9706000)
libXcursor.so.1 => /lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007f4ec96f9000)
libXext.so.6 => /lib/x86_64-linux-gnu/libXext.so.6 (0x00007f4ec94e7000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f4ec94db000)
libpixman-1.so.0 => /lib/x86_64-linux-gnu/libpixman-1.so.0 (0x00007f4ec9435000)
libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f4ec93fc000)
libxcb-shm.so.0 => /lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f4ec93f7000)
libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f4ec93cd000)
libxcb-render.so.0 => /lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f4ec93be000)
libXrender.so.1 => /lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f4ec91b2000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f4ec8f94000)
libthai.so.0 => /lib/x86_64-linux-gnu/libthai.so.0 (0x00007f4ec8f89000)
libfribidi.so.0 => /lib/x86_64-linux-gnu/libfribidi.so.0 (0x00007f4ec8f6c000)
libffi.so.6 => /lib/x86_64-linux-gnu/libffi.so.6 (0x00007f4ec8f62000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f4ec8eec000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4ec8ee7000)
libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f4ec8e94000)
libatspi.so.0 => /lib/x86_64-linux-gnu/libatspi.so.0 (0x00007f4ec8e60000)
libmount.so.1 => /lib/x86_64-linux-gnu/libmount.so.1 (0x00007f4ec8e01000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f4ec8bd7000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f4ec8bbd000)
libgraphite2.so.3 => /lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f4ec8b90000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f4ec8b53000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f4ec8b4a000)
libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007f4ec8944000)
libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f4ec873e000)
libdatrie.so.1 => /lib/x86_64-linux-gnu/libdatrie.so.1 (0x00007f4ec8734000)
libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007f4ec8693000)
libblkid.so.1 => /lib/x86_64-linux-gnu/libblkid.so.1 (0x00007f4ec863e000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f4ec8622000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f4ec85fa000)
liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f4ec85db000)
libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f4ec84bd000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f4ec849a000)
当我运行make static 时,它会编译,但在执行期间程序会说:
ziga@ziga-laptop:2020-03-26--example-a$ ./static.elf
bash: ./static.elf: No such file or directory
当程序存在并拥有+x 权限时:
ziga@ziga-laptop:2020-03-26--example-a$ ls -la | grep static.elf
-rwxr-xr-x 1 ziga ziga 1072080 Mar 30 22:36 static.elf
这就是程序static.elf 链接到共享对象的方式(libiup.so 不再存在,因为我们链接到静态版本libiup.a):
ziga@ziga-laptop:2020-03-26--example-a$ ldd static.elf
linux-vdso.so.1 (0x00007ffc73500000)
libgtk-3.so.0 => /lib/x86_64-linux-gnu/libgtk-3.so.0 (0x00007f17f7e4d000)
libgdk-3.so.0 => /lib/x86_64-linux-gnu/libgdk-3.so.0 (0x00007f17f7d51000)
libpangocairo-1.0.so.0 => /lib/x86_64-linux-gnu/libpangocairo-1.0.so.0 (0x00007f17f7d41000)
libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007f17f7c00000)
libcairo.so.2 => /lib/x86_64-linux-gnu/libcairo.so.2 (0x00007f17f7ae0000)
libgdk_pixbuf-2.0.so.0 => /lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007f17f7aba000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f17f7935000)
libpango-1.0.so.0 => /lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007f17f78ea000)
libgobject-2.0.so.0 => /lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f17f7895000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f17f7776000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f17f7755000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f17f7594000)
libgmodule-2.0.so.0 => /lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f17f758c000)
libXi.so.6 => /lib/x86_64-linux-gnu/libXi.so.6 (0x00007f17f737c000)
libXcomposite.so.1 => /lib/x86_64-linux-gnu/libXcomposite.so.1 (0x00007f17f7179000)
libXdamage.so.1 => /lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f17f7174000)
libXfixes.so.3 => /lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f17f6f6e000)
libcairo-gobject.so.2 => /lib/x86_64-linux-gnu/libcairo-gobject.so.2 (0x00007f17f6f62000)
libatk-1.0.so.0 => /lib/x86_64-linux-gnu/libatk-1.0.so.0 (0x00007f17f6f37000)
libatk-bridge-2.0.so.0 => /lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0 (0x00007f17f6f02000)
libxkbcommon.so.0 => /lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007f17f6ec0000)
libwayland-cursor.so.0 => /lib/x86_64-linux-gnu/libwayland-cursor.so.0 (0x00007f17f6eb6000)
libwayland-egl.so.1 => /lib/x86_64-linux-gnu/libwayland-egl.so.1 (0x00007f17f6eb1000)
libwayland-client.so.0 => /lib/x86_64-linux-gnu/libwayland-client.so.0 (0x00007f17f6ea0000)
libepoxy.so.0 => /lib/x86_64-linux-gnu/libepoxy.so.0 (0x00007f17f6d6c000)
libgio-2.0.so.0 => /lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007f17f6bae000)
libharfbuzz.so.0 => /lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f17f6ab3000)
libpangoft2-1.0.so.0 => /lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 (0x00007f17f6a9a000)
libfontconfig.so.1 => /lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f17f6a54000)
libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f17f6998000)
libXinerama.so.1 => /lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007f17f6991000)
libXrandr.so.2 => /lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007f17f6786000)
libXcursor.so.1 => /lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007f17f6779000)
libXext.so.6 => /lib/x86_64-linux-gnu/libXext.so.6 (0x00007f17f6567000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f17f655d000)
libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f17f6531000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f17f652c000)
libpixman-1.so.0 => /lib/x86_64-linux-gnu/libpixman-1.so.0 (0x00007f17f6486000)
libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f17f644d000)
libxcb-shm.so.0 => /lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f17f6448000)
libxcb-render.so.0 => /lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f17f6439000)
libXrender.so.1 => /lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f17f622d000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f17f600f000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f17f8576000)
libthai.so.0 => /lib/x86_64-linux-gnu/libthai.so.0 (0x00007f17f6004000)
libfribidi.so.0 => /lib/x86_64-linux-gnu/libfribidi.so.0 (0x00007f17f5fe7000)
libffi.so.6 => /lib/x86_64-linux-gnu/libffi.so.6 (0x00007f17f5fdd000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f17f5f67000)
libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f17f5f14000)
libatspi.so.0 => /lib/x86_64-linux-gnu/libatspi.so.0 (0x00007f17f5ee0000)
libmount.so.1 => /lib/x86_64-linux-gnu/libmount.so.1 (0x00007f17f5e81000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f17f5c59000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f17f5c3d000)
libgraphite2.so.3 => /lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f17f5c10000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f17f5bd3000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f17f5bca000)
libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007f17f59c6000)
libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f17f57be000)
libdatrie.so.1 => /lib/x86_64-linux-gnu/libdatrie.so.1 (0x00007f17f57b4000)
libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007f17f5713000)
libblkid.so.1 => /lib/x86_64-linux-gnu/libblkid.so.1 (0x00007f17f56be000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f17f56a4000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f17f567a000)
liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f17f565b000)
libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f17f553d000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f17f551a000)
如果有人能告诉我我在这里缺少什么以便运行该程序,我会非常高兴。我想单独使用ld。
按照建议,我正在添加来自 strace 的输出:
ziga@ziga-laptop:2020-03-26--example-a$ strace ./static.elf
execve("./static.elf", ["./static.elf"], 0x7ffcb3bec860 /* 31 vars */) = -1 ENOENT (No such file or directory)
strace: exec: No such file or directory
+++ exited with 1 +++
和readelf:
ziga@ziga-laptop:2020-03-26--example-a$ readelf -a static.elf | grep interpreter
[Requesting program interpreter: /lib/ld64.so.1]
解决方案 - 但不是我想要的
用于静态链接的工作 makefile 部分是这个:
gcc main.c -o static.elf -Wl,-Bstatic -liup -Wl,-Bdynamic \
-lc \
-lgtk-3 \
-lgdk-3 \
-lpangocairo-1.0 \
-lX11 \
-lcairo \
-lgdk_pixbuf-2.0 \
-lm \
-lpango-1.0 \
-lgobject-2.0 \
-lglib-2.0 \
-lpthread
但它不使用ld,我想知道为什么ld 无法链接...
【问题讨论】:
-
你为什么直接使用
ld?为什么不直接使用gcc前端?我确信它正在做一些ld命令不能使它工作的事情。如果你不能让它工作,我建议运行strace ./static.elf之类的东西,看看它说了什么。 -
我喜欢单独使用
ld,因为它更清晰,而且我通常会为这样的嵌入式目标包含ld脚本。如果我直接使用gcc,这也不起作用。我添加了strace返回的信息。 -
readelf -a static.elf | grep interpreter说什么? -
另外,直接使用
ld没有什么比“清晰”更好的了。gcc知道如何向它传递许多必要的开关(例如,在许多系统上,仅支持 PIE 可执行文件)。 -
您可以将
libiup.a库作为参数传递给命令行gcc main.c libiup.a ...。或者gcc main.o libiup.a ...使用 gcc 作为最终链接器。
标签: c makefile shared-libraries static-libraries