我正在尝试使用g ++设计一个共享库的共享库,希望在将来简化我的编译脚本并简化我的更新过程,但我仍然是新手,最好使用GNU工具和编写库, 。任何人都可以提供关于g ++是否可以使用以下想法的建议吗?
为方便起见,请考虑以下文件系统布局:
main.cpp
libraryX/
libraryX/libX.so
libraryX/libraryY/
libraryX/libraryY/libY.so
libraryX/libraryZ/
libraryX/libraryZ/libZ.so
我的目标是能够使用级联相对路径间接链接。例如,main.cpp链接到libraryX / libX.so,它链接到libraryY / libY.so和libraryZ / libZ.so。是否可以只将main.cpp链接到libX.so并使用libY.so和libZ.so中定义的函数?
如果是这样,你能提供一个需要这样做的标志的例子吗?我一直在尝试使用谷歌的各种来源的以下命令的变体无济于事:
g++ -shared -fPIC -Wl-rpath=libraryX -LlibraryX -lX.so main.o -o executable
非常感谢任何指导或参考。
答案 0 :(得分:1)
不要这样做(即使你能弄清楚如何)。
当您链接到-lX
时,静态链接器必须知道“此链接的一部分”的所有其他共享库。由于-lY
不在链接行上,因此静态链接器会给您一个错误,或者它必须以某种方式确定libY.so
的来源。对于后者,它必须复制运行时加载器将执行的RPATH
搜索。这种复制很容易出错(静态链接器可能不会使用完全相同的算法),最好避免使用。
最后,您的命令行完全错误:-shared
表示您要求链接器提供共享库,但您显然是在尝试链接可执行文件。链接可执行文件时,通常不应使用-fPIC
。此外,-Wl-rpath=...
应为-Wl,-rpath=...
(逗号很重要)。