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

时间:2018-09-30 10:06:17

标签: makefile compilation poco-libraries

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

1 个答案:

答案 0 :(得分:2)

发生这种情况是因为:

-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抢先删除 目标文件以将其替换为源文件。这意味着它已删除 source 文件。因此,你失败了。

此行为可能是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

您将避免此问题。