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
为我做到了这一点,但我还没有研究在构建目录(在您的例子中,它似乎是源目录的子目录)上安装会发生什么,我只是不太希望这样做会很好。