我在为共享库创建包时遇到了一些问题。
我运行dh_make
并编辑了这些文件。但是,当我去构建包时,我得到了以下信息:
******@******-laptop:~/Documents/temp/jsoncpp/jsoncpp-0.5.0$ 卸载 dpkg-buildpackage -rfakeroot -D -us -uc dpkg-buildpackage:将 CFLAGS 设置为默认值:-g -O2 dpkg-buildpackage:将 CPPFLAGS 设置为默认值: dpkg-buildpackage:将 LDFLAGS 设置为默认值:-Wl,-Bsymbolic-functions dpkg-buildpackage:将 FFLAGS 设置为默认值:-g -O2 dpkg-buildpackage:将 CXXFLAGS 设置为默认值:-g -O2 dpkg-buildpackage:源包 jsoncpp dpkg-buildpackage: 源版本 0.5.0-1 dpkg-buildpackage: 源已由 ****** 更改 dpkg-buildpackage:主机架构 amd64 fakeroot debian/规则清理 dh 清洁 dh_testdir dh_auto_clean dh_clean dpkg-source -b jsoncpp-0.5.0 dpkg-source:信息:使用源格式“1.0” dpkg-source:信息:使用现有的 jsoncpp_0.5.0.orig.tar.gz 构建 jsoncpp dpkg-source:信息:在 jsoncpp_0.5.0-1.diff.gz 中构建 jsoncpp dpkg-source:信息:在 jsoncpp_0.5.0-1.dsc 中构建 jsoncpp debian/规则构建 dh 构建 dh_testdir dh_auto_configure dh_auto_build make[1]: 进入目录 `/home/******/Documents/temp/jsoncpp/jsoncpp-0.5.0' 测试 -d obj || mkdir obj g++ -I./include -c -o obj/json_reader.o src/lib_json/json_reader.cpp g++ -I./include -c -o obj/json_writer.o src/lib_json/json_writer.cpp g++ -I./include -c -o obj/json_value.o src/lib_json/json_value.cpp ar -r libjsoncpp.a obj/json_reader.o obj/json_writer.o obj/json_value.o ar:创建 libjsoncpp.a make[1]: 离开目录 `/home/******/Documents/temp/jsoncpp/jsoncpp-0.5.0' dh_auto_test fakeroot debian/规则二进制文件 dh 二进制 dh_testroot dh_prep dh_installdirs dh_auto_install make[1]: 进入目录 `/home/******/Documents/temp/jsoncpp/jsoncpp-0.5.0' sudo cp -r include/json --target-directory=/usr/include 错误:ld.so:来自 LD_PRELOAD 的对象‘libfakeroot-sysv.so’无法预加载:忽略。 cp libjsoncpp.a /usr/lib/libjsoncpp.a cp:无法创建常规文件“/usr/lib/libjsoncpp.a”:权限被拒绝 make[1]: *** [安装] 错误 1 make[1]: 离开目录 `/home/******/Documents/temp/jsoncpp/jsoncpp-0.5.0' dh_auto_install:make -j1 install DESTDIR=/home/******/Documents/temp/jsoncpp/jsoncpp-0.5.0/debian/tmp 返回退出代码 2 make:*** [二进制] 错误 29 dpkg-buildpackage:错误:fakeroot debian/rules 二进制文件给出错误退出状态 2 debuild:第 1340 行出现致命错误: dpkg-buildpackage -rfakeroot -D -us -uc 失败
问题似乎出在这里:
错误:ld.so:无法预加载来自 LD_PRELOAD 的对象‘libfakeroot-sysv.so’:忽略。cp
libjsoncpp.a /usr/lib/libjsoncpp.a
cp:无法创建常规文件‘/usr/lib/libjsoncpp.a’:权限被拒绝
...但我根本不知道问题是什么。
makefile 是这里如果需要的话。
答案1
您使用的 Makefile 不尊重 DESTDIR 变量 - 软件包在构建时不应直接安装到 /usr,而是将文件放入临时树中。您提到您自己添加了 Makefile - 通常情况下,您需要让它使用 DESTDIR 变量作为所有安装路径的前缀。查看软件包构建说明后,该软件包使用 scons 作为构建系统,它是 make 的替代品。dh_make 很可能没有用于构建软件包的模板,因此您应该寻找使用它进行构建的软件包,例如 yafray,并查看它们的 debian/rules
由于软件包构建从来不以 root 身份完成,因此最好显示并更正此错误,而不是在毫无戒心的开发人员的系统上构建软件包时让软件包覆盖重要文件。
答案2
正如您所想,问题出在这里:
cp libjsoncpp.a /usr/lib/libjsoncpp.a
您以普通用户身份进行调用debbuild
,没有权限写入该目录。如果您尝试,sudo debbuild
应该可以。