注:我带着问题访问了很多主题相似的对于这一点,虽然被接受的解决方案都是我所已经尝试过了,因此,在标记为重复之前请考虑这一点。
另外,我对 Linux 还很陌生,所以如果我说了一些根本错误的话,请随时纠正我。
问题:
我正在尝试创建并使用 c++共享库虽然“创建”部分似乎已经完成,但在尝试链接它时,ld 看不到它。
以下是我已经完成的事情:
使用 -fPIC 明确声明编译所有 .cpp 文件
使用以下方式创建库
g++ -shared -fPIC -Wl,-soname,libcustom_program_options.so.1 -o libcustom_program_options.so.1.0.1 *.o
运行 ldconfig 来更新加载程序缓存,如下所示:
sudo ldconfig -n /usr/local/lib
当我尝试将该库链接到我的测试程序时:
g++ main.cpp -o main -L /usr/local/lib -l libcustom_program_options
事情的经过如下:
/usr/bin/ld:找不到 -llibcustom_program_options
collect2:错误:ld 返回 1 退出状态
注意:我不确定 ld 是否在寻找图书馆的全名或者索纳梅或者“lib- 和 .so.{version} 之间的名称”,所以我尝试了每一个。但都没有帮助。
答案1
好的,我终于解决了。
一旦我检查链接器实际上期望找到什么文件,我知道下一步该做什么了。
我通过以下方式完成此操作:
ld -L/usr/local/lib -lcustom_program_options --verbose
在哪里在 /usr/local/lib 中是我放置库的目录,自定义程序选项是去掉 lib- 前缀和所有前缀(即扩展和版本)的库名称。
当它打印出所有考虑的目录列表以及准确的预期文件名时,我知道它在寻找libcustom_program_options.so,同时调用 ldconfig (在 OP 中提到)仅在之间设置链接libcustom_program_options.so.1和libcustom_program_options.so.1.0.1(请注意版本号)。
ld 尝试查找的文件确实不存在。
解决方案是手动创建链接:
sudo ln -s /usr/local/lib/libcustom_program_options.so.1 /usr/local/lib/libcustom_program_options.so
所以这基本上解决了问题。罪魁祸首是我不知道链接器寻找的确切文件名是什么。