为什么 `make install` 会删除 `make` 生成的库文件 *.so?

Why `make install` is deleting library files *.so generated by `make`?

我正在编译 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 文件也不会复制到那里。

发生这种情况是因为:

-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-like 操作系统上,应将本地构建的软件包安装到 /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 和 header 中 在 /usr/local/include/Poco/usr/local/lib 是默认的库搜索路径 链接器和 /usr/local/include 是编译器的默认 header 搜索路径。

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

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

这样你就可以避免这个问题了。