Makefile 为什么“make install”正在删除由“make”生成的库文件*? < >我正在编译C++ PoCO库。我知道 cmake -DCMAKE_INSTALL_PREFIX=./ -DCMAKE_BUILD_TYPE=Debug ../ make make install

Makefile 为什么“make install”正在删除由“make”生成的库文件*? < >我正在编译C++ PoCO库。我知道 cmake -DCMAKE_INSTALL_PREFIX=./ -DCMAKE_BUILD_TYPE=Debug ../ make make install,makefile,compilation,poco-libraries,Makefile,Compilation,Poco Libraries,在makeinstall中,我得到一个错误 "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.6

makeinstall
中,我得到一个错误

 "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
创建的,但是
makeinstall
会删除它

为什么呢

如果我没有运行
makeinstall
,安装路径中的文件夹不会被创建,所有
*.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操作系统上,本地构建的软件包应安装到
/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\u INSTALL\u PREFIX=。/
make INSTALL
的目标,而不是
make
(实际上是当前目录:不是吗?)。另外,
make install
将库文件从一个路径复制到另一个路径,删除目标中的文件,但由于两个路径相同,首先删除目标中的文件意味着删除要复制的文件。因此,无法完成由这些文件的副本组成的安装过程。正确吗?
././configure--prefix=./
等同于
-DCMAKE\u INSTALL\u prefix=./
?@FrancescoBoi正确!另一个愚蠢的问题是:
makeinstall
如何在
include
目录中创建头文件?看起来有时候运行
make
makeinstall
,然后再运行
make
,实际上是在重新创建原始文件。有时会创建一些标题(可能不是所有标题,也可能取决于应用程序中包含的标题),有时会丢失一些标题。它们只是源代码的副本,还是有更深的一步?你知道它们是什么时候创建的吗?@FrancescoBoi与库一样,安装头应该简单地归结为将每个头从其源位置复制到/include/Poco,如果它还不是最新的
makeinstall
为我做到了这一点,但我还没有研究在构建目录(在您的例子中,它似乎是源目录的子目录)上安装会发生什么,我只是不太希望这样做会很好。