C++ 为什么找不到库,即使它们显然在-L路径上?
我有以下链接命令(很抱歉,它太长了,但我尝试尽可能地保留它,只是缩短了一些路径): 抄送C++ 为什么找不到库,即使它们显然在-L路径上?,c++,c,gcc,linker,C++,C,Gcc,Linker,我有以下链接命令(很抱歉,它太长了,但我尝试尽可能地保留它,只是缩短了一些路径): 抄送 cmakfiles/main.dir/main.cpp.o-o main-L/me/libs/cgal/lib -L/me/libs/tbb/tbb-2017_U7/build/linux_intel64_gcc_cc5.3.0_libc2.19_kernel3.12.61_发行版 -rdynamic-lmpfr-lgmp/me/libs/cgal/lib/libCGAL_ImageIO.a/me/libs
cmakfiles/main.dir/main.cpp.o-o main-L/me/libs/cgal/lib -L/me/libs/tbb/tbb-2017_U7/build/linux_intel64_gcc_cc5.3.0_libc2.19_kernel3.12.61_发行版 -rdynamic-lmpfr-lgmp/me/libs/cgal/lib/libCGAL_ImageIO.a/me/libs/cgal/lib/libCGAL.a-lboost_线程-lboost_系统 -lz/me/libs/cgal/lib/libCGAL_ImageIO.a/me/libs/cgal/libCGAL.a-lboost_thread-lboost_system-lz-ltbb-ltbbmalloc-Wl,-rpath,/me/libs/cgal/lib:/me/libs/tbb/tbb-2017\u U7/build/linux\u intel64\u gcc\u cc5.3.0\u libc2.19\u kernel3.12.61\u发行版 它会告诉我: /usr/bin/ld:找不到-ltbb /usr/bin/ld:找不到-ltbbmalloc 最可能与这个问题相关的是我有
-L/me/libs/tbb/tbb-2017\u U7/build/linux\u intel64\u gcc\u cc5.3.0\u libc2.19\u kernel3.12.61\u release
和-ltbb-ltbbmalloc
。在-L
目录中,有一个libtbb.so
和一个libtbbmalloc.so
但是为什么链接器找不到这些库,即使它们显然存在于-L
给定的目录中?
EDIT1:我被要求使用文件命令进行检查。我得到以下答案:
- *.o文件是ELF 64位LSB可重定位的x86-64版本1(GNU/Linux),未剥离
libtbb.so.2是ELF 64位LSB共享对象,x86-64,版本1(SYSV),动态链接,而不是剥离
看起来不完全一样,但我不知道它是否兼容。基本上,我是用同一个编译器编译的。但我不确定TBB的构建系统是否会潜入其他选项
EDIT2:我还被要求使用strace
。摘录如下:
open("/me/libs/tbb/tbb-2017_U7/build/linux_intel64_CC_cc5.3.0_libc2.19_kernel3.12.61_release/libtbb.so", O_RDONLY) = 12
[pid 102330] open("/me/libs/tbb/tbb-2017_U7/build/linux_intel64_CC_cc5.3.0_libc2.19_kernel3.12.61_release/libtbb.so", O_RDONLY) = 11
[pid 102330] open("libtbb.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 102330] open("/me/libs/cgal/lib/libtbb.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 102330] open("/me/libs/tbb/tbb-2017_U7/build/linux_intel64_CC_cc5.3.0_libc2.19_kernel3.12.61_release/libtbb.so.2", O_RDONLY) = 11
它似乎检查了一些文件,然后最终找到了它要查找的文件。也许它们是针对错误的体系结构。使用
file
命令检查。尝试将--verbose传递给链接器,查看它试图打开哪些文件。如果失败,请尝试编译命令的strace-e open-f
。我仍然怀疑ELF格式是否不兼容…?这里出了问题。如果链接器试图打开一个文件,它应该以详细模式报告它。如果它不报告任何内容,则不会尝试打开它。但是斯特拉斯说它已经开放了。也许它是开着的,但不是由劳工处开着的?你可以看看谁用strace-f-e打开了什么,execve。还可以查看CC在to级别传递给ld.Just-v的参数。斯特拉斯也会给他们看。