【问题标题】:Why `make install` is deleting library files *.so generated by `make`?为什么`make install`正在删除`make`生成的库文件*.so?
【发布时间】:2018-09-30 10:06:17
【问题描述】:

我正在编译 C++ Poco 库。我愿意

cmake -DCMAKE_INSTALL_PREFIX=./ -DCMAKE_BUILD_TYPE=Debug ../
make
make install

make install 我收到一个错误

 "path/poco/instDir/lib/libPocoEncodingsd.so.60".
Call Stack (most recent call first):
  cmake_install.cmake:50 (include)


Makefile:85: recipe for target 'install' failed
make: *** [install] Error 

基本上libPocoEncodingsd.so.60 文件是用make 创建的,但随后make install 将其删除。

这是为什么呢?

如果我不运行make install,则不会创建安装路径内的文件夹,并且不会将所有*.h 文件复制到那里。

【问题讨论】:

    标签: makefile compilation poco-libraries


    【解决方案1】:

    发生这种情况是因为:

    -DCMAKE_INSTALL_PREFIX=./
    

    表示您正在构建目录本身的顶部进行安装, 结果对于 cmake 命令中的每个文件名:

      file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE SHARED_LIBRARY FILES
        "path/poco/instDir/lib/libPocoEncodingsd.so.60"
        "path/poco/instDir/lib/libPocoEncodingsd.so"
        )
    

    源文件和目标文件相同。 Cmake 抢先删除 目标文件将其替换为源文件。这意味着它已删除 文件。因此你的失败。

    这种行为可能是 cmake 中的一个错误。从表面上看,如果它检查并发现 目标文件存在并且与源文件具有相同的时间戳,它应该考虑 目标文件是最新的,而不是尝试替换它。但我还没有深入研究。在构建目录之上安装是合理分类的 在不要那样做下。

    通常在类 Unix 操作系统上,本地构建的软件包应安装到 /usr/local。这就是/usr/local 的用途。 Cmake,和其他源码包一样 部署工具,默认情况下遵守此约定。因此,如果您只是运行:

    cmake -DCMAKE_BUILD_TYPE=Debug ../
    make
    sudo make install  # Or however you run `make install` as root.
    

    然后poco 库将安装在/usr/local/lib 和标题 在/usr/local/include/Poco/usr/local/lib 是默认库搜索路径 链接器和/usr/local/include 是编译器的默认头搜索路径。

    如果由于某种原因您不想安装到默认前缀,那么 选择一些:

    -DCMAKE_INSTALL_PREFIX=/not/in/the/build/dir
    

    你会避免这个问题。

    【讨论】:

    • 所以-DCMAKE_INSTALL_PREFIX=./make install 的目的地,而不是make 的目的地(这实际上是当前目录:不是吗?)。同样make install 将库文件从一个路径复制到另一个路径,删除目标中的文件,但由于两个路径相同,因此首先删除目标中的文件意味着删除要复制的文件。因此,它无法完成包含这些文件副本的安装过程。对吗?
    • .././configure --prefix=./ 是否等同于 -DCMAKE_INSTALL_PREFIX=./
    • @FrancescoBoi 正确!
    • 另一个愚蠢的问题:make install 如何在include 目录中创建标题?似乎有时运行makemake install 然后make 再次运行实际上它正在重新创建原始文件。有时会创建一些标头(可能不是所有标头,或者可能取决于您的应用程序中包含的标头),有时其中一些标头会丢失。它们只是源头的副本还是有更深层次的步骤?你知道它们是什么时候创建的吗?
    • @FrancescoBoi 与库一样,安装标头应该归结为简单地将每个标头从其源位置复制到 /include/Poco,如果它还不是最新的。 make install 为我做了这个,但我还没有研究如果我安装在我的构建目录(在你的情况下似乎是 source 目录的子目录)会发生什么,我只是不会有太大的希望。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多