为什么 `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
这样你就可以避免这个问题了。
我正在编译 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
这样你就可以避免这个问题了。