
我正在嘗試使用 cmake 和 mingw 交叉編譯器從 debian 建立 *.deb 檔案。使用 .CMake 時,CMake 的編譯器測試失敗dpkg-buildpackage
。
正常建置沒問題:
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr
-DCMAKE_VERBOSE_MAKEFILE=ON
-DCMAKE_BUILD_TYPE=None
-DCMAKE_INSTALL_SYSCONFDIR=/etc
-DCMAKE_INSTALL_LOCALSTATEDIR=/var
-- The C compiler identification is GNU 6.3.0
-- The CXX compiler identification is GNU 6.3.0
-- Check for working C compiler: /etc/alternatives/i686-w64-mingw32-gcc
-- Check for working C compiler: /etc/alternatives/i686-w64-mingw32-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /etc/alternatives/i686-w64-mingw32-g++
-- Check for working CXX compiler: /etc/alternatives/i686-w64-mingw32-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
但是,當我使用它來構建它時,dpkg-buildpackage
它無法配置:
dpkg-buildpackage -uc -us
dpkg-buildpackage: info: source package foo
dpkg-buildpackage: info: source version 1.0
dpkg-buildpackage: info: source distribution stretch
dpkg-buildpackage: info: source changed by $USER
dpkg-buildpackage: info: host architecture amd64
dpkg-source --before-build hw
fakeroot debian/rules clean
dh clean --buildsystem=cmake --parallel
dh_testdir -O--buildsystem=cmake -O--parallel
dh_auto_clean -O--buildsystem=cmake -O--parallel
dh_clean -O--buildsystem=cmake -O--parallel
dpkg-source -b hw
dpkg-source: info: using source format '3.0 (native)'
dpkg-source: info: building sim-honeywell-ease-control in sim-honeywell-ease-control_1.0.tar.xz
dpkg-source: info: building sim-honeywell-ease-control in sim-honeywell-ease-control_1.0.dsc
debian/rules build
make: 'build' is up to date.
fakeroot debian/rules binary
dh binary --buildsystem=cmake --parallel
dh_testdir -O--buildsystem=cmake -O--parallel
dh_update_autotools_config -O--buildsystem=cmake -O--parallel
dh_auto_configure -O--buildsystem=cmake -O--parallel
cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=None -DCMAKE_INSTALL_SYSCONFDIR=/etc -DCMAKE_INSTALL_LOCALSTATEDIR=/var
-- The C compiler identification is GNU 6.3.0
-- The CXX compiler identification is GNU 6.3.0
-- Check for working C compiler: /etc/alternatives/i686-w64-mingw32-gcc
-- Check for working C compiler: /etc/alternatives/i686-w64-mingw32-gcc -- broken
CMake Error at /usr/share/cmake-3.7/Modules/CMakeTestCCompiler.cmake:51 (message):
The C compiler "/etc/alternatives/i686-w64-mingw32-gcc" is not able to
compile a simple test program.
完整日誌中有趣的部分是連結期間的失敗:
/etc/alternatives/i686-w64-mingw32-gcc -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-z,relro -Wl,--whole-archive CMakeFiles/cmTC_fc912.dir/objects.a -Wl,--no-whole-archive -o cmTC_fc912.exe -Wl,--out-implib,libcmTC_fc912.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/cmTC_fc912.dir/linklibs.rsp
/usr/bin/i686-w64-mingw32-ld: unrecognized option '-z'
mingw 連結器無法辨識該-z
選項。當我diff
CMakeCache.txt 時,我可以看到 dpkg-buildpakcage 預設添加一些連結器標誌:
< CMAKE_EXE_LINKER_FLAGS:STRING=-Wl,-z,relro
---
> CMAKE_EXE_LINKER_FLAGS:STRING=
我怎樣才能防止dpkg-buildpackage
這樣做?
僅供參考:我的debian/rules
文件如下所示:
#!/usr/bin/make -f
%:
dh $@ --buildsystem=cmake --parallel
答案1
您需要停用relro
強化配置;改變你debian/rules
的
#!/usr/bin/make -f
export DEB_BUILD_MAINT_OPTIONS = hardening=-relro
%:
dh $@ --buildsystem=cmake --parallel
看線上說明dpkg-buildflags
頁了解詳情。
(順便說一句,如果您使用的是相容等級 10 或更高版本,則不需要,--parallel
因為預設已啟用它。在許多情況下,您--buildsystem=cmake
也可以刪除它,因為dh
系統會自動檢測它。)