我正在编译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
文件都不会复制到那里。
答案 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
您将避免此问题。