Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用CMake正确管理共享库_C++_Cmake_Shared Libraries_Rpath - Fatal编程技术网

C++ 使用CMake正确管理共享库

C++ 使用CMake正确管理共享库,c++,cmake,shared-libraries,rpath,C++,Cmake,Shared Libraries,Rpath,我正在尝试将一个cmake构建与两个共享库链接,链接发生时,RPATH指向两个库之一的绝对路径,而readelf输出对另一个库不正确 我所做的是: add_library(foo SHARED IMPORTED) set_target_properties(foo PROPERTIES IMPORTED_LOCATION ${LIBS_DIRECTORY}/foo/libfoo.so ) add_library(bar SHARED IMPORTED) set_target_proper

我正在尝试将一个cmake构建与两个共享库链接,链接发生时,
RPATH
指向两个库之一的绝对路径,而
readelf
输出对另一个库不正确

我所做的是:

add_library(foo SHARED IMPORTED)
set_target_properties(foo 
  PROPERTIES IMPORTED_LOCATION ${LIBS_DIRECTORY}/foo/libfoo.so
)

add_library(bar SHARED IMPORTED)
set_target_properties(bar
  PROPERTIES IMPORTED_LOCATION ${LIBS_DIRECTORY}/foo/libbar.so
)

target_link_libraries(myprogram foo bar)
0x0000000000000001 (NEEDED)             Shared library: [../../../libs/foo/libfoo.so]
0x0000000000000001 (NEEDED)             Shared library: [libbar.so]
0x000000000000000f (RPATH)              Library rpath: [/home/user/test/trunk/libs/foo:/home/user/test/trunk/libs/bar]
这可以工作并进行链接,但readelf打印以下内容:

add_library(foo SHARED IMPORTED)
set_target_properties(foo 
  PROPERTIES IMPORTED_LOCATION ${LIBS_DIRECTORY}/foo/libfoo.so
)

add_library(bar SHARED IMPORTED)
set_target_properties(bar
  PROPERTIES IMPORTED_LOCATION ${LIBS_DIRECTORY}/foo/libbar.so
)

target_link_libraries(myprogram foo bar)
0x0000000000000001 (NEEDED)             Shared library: [../../../libs/foo/libfoo.so]
0x0000000000000001 (NEEDED)             Shared library: [libbar.so]
0x000000000000000f (RPATH)              Library rpath: [/home/user/test/trunk/libs/foo:/home/user/test/trunk/libs/bar]
因此,基本上两个lib中的一个(但只有一个,没有意义)有一个绝对路径,而rpath包含两个完整路径(这不是我想要做的,因为我想将可执行文件与两个库一起发布在可执行文件的同一文件夹(或最多一个子文件夹)中)


当你调用
make install
使其变得可移植时,我是否遗漏了一些琐碎的东西?

CMake。你这样做了吗?@comicansms:我根本没有安装目标,因为我只将CMake用作构建工具,而不是重新分发脚本(源代码已关闭),因此我的主要兴趣是能够编译它,并使其与可执行文件一起提供的共享库一起工作,仅此而已。您可能需要添加安装步骤。IIRC生成的rpath特定于生成树,如果您开始复制内容,则很容易断开。安装应该是典型的轻松清理(甚至可以在不更改任何与rpath相关的默认设置的情况下工作)。不幸的是,这是一个棘手的问题,我不太经常接触CMake的这一部分,因此我在这里的知识有点生疏。事实证明,您不需要安装步骤。通过将变量设置为true,您将在生成树中获得清理过的版本。@Antonio:我正在随机测试属性,它看起来像是
IMPORTED\u NO\u SONAME true
删除了绝对路径,但我不知道为什么,我真的在摸索。