直接把里面的examples目录复制过来 工作路径当然设置quickjspp所在路径 代码编译的时候,clock_gettime函数找不到,网上搜索了说这个函数windows不支持,可惜tdm-gcc也不包含librt.a 库,我也懒得下载mingw去找librt.a这个库,只能先注释了这句代码确保执行成功
linux-vdso.so.1 => (0x00007fff8dbfe000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f94558e4000) librt.so .1 => /lib64/librt.so.1 (0x00007f94556dc000) libacl.so.1 => /lib64/libacl.so.1 (0x00007f94554d3000
00007fb3fbfac000 4K rw--- /usr/lib64/libsasl2.so.2.0.23 00007fb3fbfad000 28K r-x-- /lib64/librt -2.12.so 00007fb3fbfb4000 2044K ----- /lib64/librt-2.12.so 00007fb3fc1b3000 4K r---- /lib64/ librt-2.12.so 00007fb3fc1b4000 4K rw--- /lib64/librt-2.12.so 00007fb3fc1b5000 60K r-x-- /usr
libplc4.so libnspr4.so libpthread.so.0 libdl.so.2 libz.so.1 libc.so.6 libidn.so.11 libldap-2.4.so.2 librt.so libplc4.so libnspr4.so libpthread.so.0 libdl.so.2 libz.so.1 libc.so.6 libidn.so.11 libldap-2.4.so.2 librt.so libidn.so.11 (0x00007fbd9a701000) libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007fbd9a4ac000) librt.so .1 => /lib64/librt.so.1 (0x00007fbd9a2a4000) libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fbd9a057000
target_link_libraries(main PRIVATE LIBDL::LIBDL LIBRT::LIBRT WINSOCK::WINSOCK civetweb::civetweb) using
ldd /bin/ls linux-gate.so.1 => (0x0052b000) libselinux.so.1 => /lib/libselinux.so.1 (0x00b52000) librt.so .1 => /lib/librt.so.1 (0x00a5c000) libcap.so.2 => /lib/libcap.so.2 (0x0489c000) libacl.so.1 => /lib ldd /bin/mv linux-gate.so.1 => (0x00944000) libselinux.so.1 => /lib/libselinux.so.1 (0x00b52000) librt.so .1 => /lib/librt.so.1 (0x00a5c000) libacl.so.1 => /lib/libacl.so.1 (0x048c9000) libattr.so.1 => /lib
$ export LD_TRACE_LOADED_OBJECTS=1 $ ls /usr linux-gate.so.1 =》 (0xb7fac000) librt.so.1 =》 /lib/tls/i686 /cmov/librt.so.1 (0xb7f93000) libselinux.so.1 =》 /lib/libselinux.so.1 (0xb7f79000) libacl.so.1 =》 /lib $ /lib/ld-linux.so.2 –list /bin/ls linux-gate.so.1 =》 (0xb8050000) librt.so.1 =》 /lib/tls/i686/cmov/librt.so
0x00007f252f59a000) libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f252f286000) librt.so .1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f252f07e000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so /lib/x86_64-linux-gnu cp /lib/x86_64-linux-gnu/librt.so.1 .
.1...Reading symbols from /usr/lib/debug/usr/lib64/librt-2.17.so.debug...done. done. Loaded symbols for /lib64/librt.so.1 Reading symbols from /lib64/libpthread.so.0...Reading symbols from Loaded symbols for /lib64/libdl.so.2 Reading symbols from /lib64/librt.so.1...Reading symbols from /usr /lib/debug/usr/lib64/librt-2.17.so.debug...done. done. Loaded symbols for /lib64/librt.so.1 Reading symbols from /lib64/libpthread.so.0...Reading symbols from
6 的 glibc 库提供的 memcpy 实现是 2.2.5 版本的,另外 libc 没有直接实现 clock_gettime 函数,因为老版本 glibc 里 clock_gettime 是由 librt 库提供 clock_gettime 支持的,而且同样也是 2.2.5 版本: [root@centos6-dev ~]# objdump -T /lib64/librt.so.1 | grep clock_gettime 虽然 CentOS 6 的 libc 库没有提供 clock_gettime 实现,但好在 glibc 自带的 librt 库里还是提供了的,因此我们可以使用 patchelf 工具修改原版的程序文件, 让程序优先加载 librt 库,这样程序就能正确加载 clock_gettime 符号了: [root@centos6-dev ~]# patchelf --add-needed librt.so.1 0x00007f7f83f5d000) /lib64/ld-linux-x86-64.so.2 (0x00007f7f84fd2000) 从 ldd 命令的输出中可以看到修改后的程序会加载 librt
main.dir/main.cpp.o: undefined reference to symbol 'shm_unlink@@GLIBC_2.2.5' //lib/x86_64-linux-gnu/librt.so
0x00007fe77af4e000) libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fe77ac3a000) librt.so .1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fe77aa32000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so /lib/x86_64-linux-gnu/ cp -p /lib/x86_64-linux-gnu/librt.so.1 .
/lib/libgthread-2.0.so.0 (0x00007fe8eabb7000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fe8eaba5000 /lib/libgthread-2.0.so.0 (0x00007f1aeab62000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f1aeab50000
Wno-psabi 编译选项参考: note: the mangling of 'va_list' has changed in GCC 4.4clock_gettime 未定义的引用解决办法: 编译时加入动态库 librt.so
linux-vdso.so.1 => (0x00007ffd3a9fc000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fb13d467000) librt.so .1 => /lib64/librt.so.1 (0x00007fb13d25f000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb13d043000
GLIBC_2.2.5)(64bit) libpcre.so.0()(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) librt.so .1()(64bit) librt.so.1(GLIBC_2.2.5)(64bit) libz.so.1()(64bit) rtld(GNU_HASH) Checking for unpackaged
0x00007f713937d000) libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f713935b000) librt.so .1 => /usr/lib/librt.so.1 (0x00007f7139350000) libgobject-2.0.so.0 => /usr/lib/libgobject-2.0
=> /lib64/libdl.so.2 (0x00000032a1a00000) libutil.so.1 => /lib64/libutil.so.1 (0x00000032a3a00000) librt.so .1 => /lib64/librt.so.1 (0x00000032a1e00000) libm.so.6 => /lib64/libm.so.6 (0x00000032a2200000) libc.so
/lib64/libcap.so.2 (0x00007f90e5625000) libm.so.6 => /lib64/libm.so.6 (0x00007f90e5323000) librt.so .1 => /lib64/librt.so.1 (0x00007f90e511b000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f90e4ef4000
见下面的例子: [root@www ~]# file main.obj /usr/bin/cat /lib/librt-2.17.so main.obj: ELF 64-bit libs), for GNU/Linux 2.6.32, BuildID[sha1]=8ac8b57ae50762a4a0480486839107e87b3c284d, stripped /lib/librt