使用Clang链接.so文件

15

我一直在收到

ld: library not found for -lchaiscript_stdlib-5.3.1.so
clang: error: linker command failed with exit code 1 (use -v to see invocation)

当尝试链接到一个 .so 文件时。

我正在使用这个命令:

clang++ Main.cpp -o foo -L./ -lchaiscript_stdlib-5.3.1.so

我做错了什么?

文件libchaiscript_stdlib-5.3.1.so和文件Main.cpp在同一个目录中。我以为-L./会将.so添加到库搜索路径中。

1个回答

30

是的,-L选项会添加搜索路径,但链接器会自动添加.so(或.a)后缀(就像它添加lib前缀一样)。因此,您只需要有-lchaiscript_stdlib-5.3.1,链接器就会找到它。

您还可以跳过添加路径,直接链接文件:

clang++ Main.cpp -o foo libchaiscript_stdlib-5.3.1.so

请注意,运行时链接器(实际上在运行程序时加载共享库的工具)可能无法找到库,如果它不在运行时链接器的路径中。但是,您可以告诉(编译时)链接器将路径添加到生成的程序的共享库路径中:
clang++ Main.cpp -o foo libchaiscript_stdlib-5.3.1.so -Wl,-rpath,/absolute/path

-Wl选项告诉编译器前端将一个选项传递给链接器,而链接器选项-rpath则将路径添加到运行时链接器搜索路径中。


1
“-L”和“-rpath”的区别是什么?在我看来,两者都用于指定库路径。 - Searene
3
-L选项用于在编译时将路径添加到链接器路径中。而-rpath选项则用于在加载库时(当操作系统加载库时)将路径添加到库路径中。 - Some programmer dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接