Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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++ 什么';写CMakeLists.txt静态链接目标和次要依赖项的正确方法是什么?_C++_Linux_Gcc_Cmake_Static Linking - Fatal编程技术网

C++ 什么';写CMakeLists.txt静态链接目标和次要依赖项的正确方法是什么?

C++ 什么';写CMakeLists.txt静态链接目标和次要依赖项的正确方法是什么?,c++,linux,gcc,cmake,static-linking,C++,Linux,Gcc,Cmake,Static Linking,首先,我认为问题的标题基本上是准确的,但是如果我问得不对,请告诉我如何更改它 我有一个我想使用的可执行文件,特别是。在readme.md上有很多关于如何动态构建的说明但是,我的部署要求我静态链接目标,以避免在使用前安装依赖项。我如何做到这一点 根据readelf的说法,音频波形取决于以下几点: $ readelf -d ~/Desktop/audiowaveform Dynamic section at offset 0x4dd78 contains 35 entries: Tag

首先,我认为问题的标题基本上是准确的,但是如果我问得不对,请告诉我如何更改它

我有一个我想使用的可执行文件,特别是。在readme.md上有很多关于如何动态构建的说明但是,我的部署要求我静态链接目标,以避免在使用前安装依赖项。我如何做到这一点

根据readelf的说法,音频波形取决于以下几点:

$ readelf -d ~/Desktop/audiowaveform

Dynamic section at offset 0x4dd78 contains 35 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libsndfile.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libgd.so.3]
 0x0000000000000001 (NEEDED)             Shared library: [libmad.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libid3tag.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libboost_program_options.so.1.58.0]
 0x0000000000000001 (NEEDED)             Shared library: [libboost_filesystem.so.1.58.0]
 0x0000000000000001 (NEEDED)             Shared library: [libboost_regex.so.1.58.0]
 0x0000000000000001 (NEEDED)             Shared library: [libboost_system.so.1.58.0]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
太好了。所有这些都包含在CMakeLists.txt中,并带有
find_package(x)
等等。唯一没有明确包含的lib是libstdc++、libm、libgcc_s和libc,我想它们是特殊的标准库,可以自动使用吗?(虽然这不是我的问题,但我也希望这里清晰明了。)

因为我想要一个静态链接的输出,所以修改CMakeLists.txt以查找这些库的静态版本似乎很简单,方法是在
find\u package()
语句上方添加类似
SET(CMAKE\u find\u LIBRARY\u后缀.a”)

问题是,这些库本身有许多动态依赖关系。如果我简单地这样做,这些二级依赖关系将无法解决,链接器将被一堆
/usr/lib/gcc/x86\u 64-linux-gnu/5/../../../../../../../../libid3tag.a(util.o):在函数“id3\u util\u compress”中:
(.text+0x2a9):对“compress2”的未定义引用
等,以此类推,持续数天

我想我知道如何使用
ldd
按顺序查找整个依赖项列表:

$ ldd ~/Desktop/audiowaveform
    linux-vdso.so.1 =>  (0x00007ffcd057f000)
    libsndfile.so.1 => /usr/lib/x86_64-linux-gnu/libsndfile.so.1 (0x00007f748288d000)
    libgd.so.3 => /usr/lib/x86_64-linux-gnu/libgd.so.3 (0x00007f7482621000)
    libmad.so.0 => /usr/lib/x86_64-linux-gnu/libmad.so.0 (0x00007f7482401000)
    libid3tag.so.0 => /usr/lib/libid3tag.so.0 (0x00007f74821e8000)
    libboost_program_options.so.1.58.0 => /usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.58.0 (0x00007f7481f6a000)
    libboost_filesystem.so.1.58.0 => /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.58.0 (0x00007f7481d51000)
    libboost_regex.so.1.58.0 => /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.58.0 (0x00007f7481a49000)
    libboost_system.so.1.58.0 => /usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0 (0x00007f7481845000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f74814c2000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f74811b9000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7480fa3000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7480bd9000)
    libFLAC.so.8 => /usr/lib/x86_64-linux-gnu/libFLAC.so.8 (0x00007f7480964000)
    libvorbisenc.so.2 => /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2 (0x00007f74806bb000)
    libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007f7480461000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7480247000)
    libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f7480022000)
    libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f747fd77000)
    libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f747fb34000)
    libXpm.so.4 => /usr/lib/x86_64-linux-gnu/libXpm.so.4 (0x00007f747f922000)
    libvpx.so.3 => /usr/lib/x86_64-linux-gnu/libvpx.so.3 (0x00007f747f4fd000)
    libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f747f289000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f747f06c000)
    libicui18n.so.55 => /usr/lib/x86_64-linux-gnu/libicui18n.so.55 (0x00007f747ec09000)
    libicuuc.so.55 => /usr/lib/x86_64-linux-gnu/libicuuc.so.55 (0x00007f747e875000)
    /lib64/ld-linux-x86-64.so.2 (0x00005567e9b26000)
    libogg.so.0 => /usr/lib/x86_64-linux-gnu/libogg.so.0 (0x00007f747e66b000)
    libvorbis.so.0 => /usr/lib/x86_64-linux-gnu/libvorbis.so.0 (0x00007f747e43f000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f747e215000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f747dedb000)
    liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f747dcb9000)
    libjbig.so.0 => /usr/lib/x86_64-linux-gnu/libjbig.so.0 (0x00007f747daab000)
    libicudata.so.55 => /usr/lib/x86_64-linux-gnu/libicudata.so.55 (0x00007f747bff3000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f747bdef000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f747bbcc000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f747b9c8000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f747b7c2000)
我相信,如果我手动将整个依赖项列表写入CMakeLists.txt,边写FindX.cmake模块,这将满足所有二级、三级等依赖项。但肯定有更快的方法;自动满足指定静态库的二级依赖关系的,对吗


在静态地将目标与CMake链接时,满足整个依赖关系树的最佳方法是什么?

但肯定有一种更快的方法;自动满足指定静态库的二级依赖项的库,对吗?
-与动态库不同,静态库没有所需库的列表,因此没有自动收集所有间接依赖项的直接方法。CMake对此无能为力。有人可能会猜测,静态库的命名方式与共享库的命名方式类似,但这并不总是正确的。没有直接的方法,当然,但是我们不能假设ldd的输出。所有动态库都存在一个静态库,如果需要更多的手动干预,会出现错误吗?当然,在大多数情况下,这会起到作用。我是否完全没有意识到这是一个多么频繁的问题,它看起来像是基本和有用的功能?
,但肯定有更快的方法;自动满足指定静态库的二级依赖项的库,对吗?
-与动态库不同,静态库没有所需库的列表,因此没有自动收集所有间接依赖项的直接方法。CMake对此无能为力。有人可能会猜测,静态库的命名方式与共享库的命名方式类似,但这并不总是正确的。没有直接的方法,当然,但是我们不能假设ldd的输出。所有动态库都存在一个静态库,如果需要更多的手动干预,会出现错误吗?当然,在大多数情况下,这会起到作用。我是不是完全没有意识到这是一个多么频繁的问题,它看起来像是基本和有用的功能?