问题描述
我有需要 v2xmvtest.so 的程序。当我尝试通过 make 构建它时,我得到 undefined reference to * 似乎是 libssl1.0 中的那个函数。 (如果我安装它,它就可以正常构建)
但是我没有看到使用这些功能的地方。更重要的是,当我尝试 ldd v2xmvtest.so 时,它只显示 libvssl1.1 依赖项。
总结:
- 有没有办法找出程序中使用了 libvssl1.0 中的那些功能? (我有 v2xmvtest.so 的源代码并尝试搜索,但没有任何这些)
- 我需要说明为什么 ldd 不显示 libssl1.0 依赖项,但在链接期间需要它
谢谢!
解决方法
库不需要完全定义使用的符号。例如你可以有 lib.cpp
:
int foo();
int bar(int x)
{
return x + foo();
}
它甚至编译 foo
实际上还没有定义:
g++ lib.cpp -shared -o lib.so
然后你就可以拥有 main.cpp:
#include <iostream>
int bar(int);
int foo()
{
return 10;
}
int main()
{
std::cout << bar(42) << std::endl;
}
它定义了 foo
并使用 lib.so 成功编译:
g++ main.cpp lib.so -o main
lib.so 中的 foo
函数预计仅在应用程序链接时提供,并未指定确切来自何处,甚至不需要来自库。
您可以使用 nm 工具检查库中未定义的符号:
nm -C -u lib.so
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
U foo()
w __cxa_finalize@@GLIBC_2.17
w __gmon_start__
最后,您可以通过使用 -Wl,-z,defs
linker flag 进行编译来强制 gcc 确保目标文件不使用未定义的符号:
g++ lib.cpp -shared -Wl,defs -o lib.so
...
lib.cpp:(.text+0x24): undefined reference to `foo()'