Boost - คอมไพล์ข้าม - จาก Linux ไปจนถึง Windows

ฉันดาวน์โหลดซอร์สโค้ด "boost" (1.40.0) จากหน้าแรก "www.boost.org" แล้ว ฉันติดตั้ง Linux (Ubuntu 9.04 Jaunty) แล้วและพยายามรวบรวมบูสต์ไลบรารีเป็นเวอร์ชัน "WINDOWS" (เช่น ".dll" ไม่ใช่ ".so") จากเครื่อง "LINUX" ของฉัน

และตอนนี้คำถามสำคัญ:

เป็นไปได้หรือไม่ที่จะคอมไพล์ไลบรารีบูสต์ "WINDOWS" จาก "LINUX" (ถ้ามีคนพูดว่า "ใช่" ฉันจะเชื่อใจเขาเฉพาะในกรณีที่เขาทำไปแล้วก่อนหน้านี้ จะเขียนวิธีแก้ปัญหาที่นี่ซึ่งจะ ทำงานให้ฉัน ขออภัยสำหรับการมองโลกในแง่ร้าย แต่ฉันกำลังพยายามทำสิ่งนี้มาเป็นเวลา 3 วันแล้ว แต่ก็ยังไม่มีอะไรเป็นบวก)?

จนถึงตอนนี้ฉันได้รวบรวมโปรแกรม c++ ด้วยวิธีนี้ สำหรับการคอมไพล์จาก Linux เป็น Linux ฉันใช้คอมไพเลอร์ "gcc" (หรือ "g++") สำหรับการคอมไพล์จาก Linux เป็น Windows ฉันได้ใช้คอมไพเลอร์ "i586-mingw32msvc-gcc" (หรือ "i568-mingw32msvc-g++") (ซึ่งมีอยู่ในแพ็คเกจ "mingw32" สำหรับ "Ubuntu" เป็นต้น)

ดังนั้นกลยุทธ์นี้ที่ฉันต้องการใช้เพื่อรวบรวมไลบรารี่บูสต์และฉันได้ลองมาแล้วจนถึงตอนนี้ (หลังจากอ่านบทความ "การเริ่มต้นใช้งาน" ในหน้าแรกของบูสต์):

--1. ฉันเรียกใช้ "bootstrap.sh" จากไดเร็กทอรีซอร์สโค้ดบูสต์ "root":

./bootstrap.sh

--2. จากนั้นฉันได้เปลี่ยนสิ่งหนึ่งในไฟล์ "project-config.jam" (จาก "using gcc ;"):

using gcc : : i586-mingw32msvc-gcc ;

--3. และในที่สุดก็เรียกใช้ปฏิบัติการ "bjam":

./bjam stage

แต่แทนที่จะสร้าง Boost Libraries เวอร์ชัน "Windows" ฉันได้รับข้อความแสดงข้อผิดพลาดมากมาย

ใครสามารถช่วยฉันได้บ้าง?

ขอบคุณล่วงหน้า.

เปทิก


person Petike    schedule 09.09.2009    source แหล่งที่มา
comment
ตกลง ฉันจะกัด: ทำไมคุณถึงอยากจะทำเช่นนี้ล่ะ? ทำไมไม่คอมไพล์บูสต์สำหรับ Windows บน Windows?   -  person sbi    schedule 09.09.2009
comment
@sbi ทำไมจะไม่ได้ล่ะ? จะเกิดอะไรขึ้นถ้า Windows ไม่พร้อมใช้งาน จะเกิดอะไรขึ้นถ้าคุณไม่สามารถจ่ายได้? จะเป็นอย่างไรถ้าคุณต้องการความสะดวกในการคอมไพล์สำหรับแพลตฟอร์มต่างๆ จากแพลตฟอร์มเดียว   -  person Matt Joiner    schedule 06.11.2009


คำตอบ (5)


เอกสารอย่างเป็นทางการมีส่วนเกี่ยวกับการคอมไพล์แบบข้าม . เมื่อเปรียบเทียบกับสิ่งที่คุณกำลังทำอยู่ มีสองประเด็น:

  1. คุณระบุ i586-mingw32msvc-gcc และควรระบุ i586-mingw32msvc-g++ แบบแรกคือคอมไพเลอร์ C ซึ่งค่อนข้างยุ่งยากเล็กน้อยในการคอมไพล์โค้ดเบส C++ ;-)

  2. คุณต้องมี target-os=windows

โปรดทราบว่ามีข้อบกพร่องที่ทราบอยู่อย่างหนึ่ง เมื่อสร้างไลบรารี static ไลบรารีเหล่านั้นจะไม่ถูกส่งผ่าน ranlib และ mingw linker รู้สึกไม่พอใจกับเรื่องนี้เป็นพิเศษ คุณจะต้องรัน ranlib ด้วยตนเองหากคุณวางแผนที่จะใช้ไลบรารีแบบคงที่

person Vladimir Prus    schedule 10.09.2009
comment
ฉันลองด้วย i586-mingw32msvc-g++ และ target-os=windows แต่ไม่มีการสร้างอะไรเลย และฉันได้รับข้อผิดพลาด 20 บรรทัดถัดไป ดูเหมือนว่าฉันจะต้องสร้างไลบรารีจาก Windows (หรือวิธีแก้ไขปัญหาอื่น) - person Petike; 10.09.2009
comment
ให้ฉันลองตอกย้ำสิ่งที่ฉันทำให้แม่นยำยิ่งขึ้น ฉันมี SVN HEAD หรือ Boost และฉันมีสิ่งนี้ใน user-config.jam: การใช้ gcc : m : i586-mingw32msvc-g++ ; จากนั้นฉันก็เรียกใช้: bjam toolset=gcc-m target-os=windows Variant=debug --with-program_options ฉันเห็นคำสั่งทำงาน และในที่สุด stage/lib/libboost_program_options.lib ก็ถูกสร้างขึ้น คุณลองทำแบบเดียวกันได้ไหม? หากได้ผล โปรดระบุข้อผิดพลาดที่คุณได้รับจากการใช้งาน หากไม่ได้ผลก็ให้แสดงข้อผิดพลาดด้วย ฉันคิดว่าข้อผิดพลาดไม่พอดีกับ SO ดังนั้นให้ใช้ codepad.org - person Vladimir Prus; 13.09.2009
comment
ในที่สุดมันก็ได้ผลสำหรับฉัน ฉันผิด ฉันแค่พยายามรวบรวมไลบรารีเธรดเท่านั้น ไม่ใช่ทั้งหมด และไม่สามารถคอมไพล์เธรดได้เนื่องจากไม่พบ pthreads ฉันเพิ่มเท่านั้น: threadapi=win32 และหลังจากนั้นก็โอเค ดังนั้นคำสั่งทั้งหมดคือ: ./bjam --layout=system Variant=release threading=multi link=shared runtime-link=shared toolset=gcc target-os=windows threadapi=win32 stage แต่ฉันยังคงไม่สามารถรวบรวมไลบรารีเหล่านี้ได้: -graph -graph_parallel -iostreams -math (บางส่วน) -python ส่วนอื่นๆ สามารถคอมไพล์ได้ - person Petike; 17.09.2009
comment
คุณต้องการไลบรารี่อื่นๆ ทั้งหมดเหล่านั้นหรือไม่? ถ้าไม่เช่นนั้น ให้ใช้ --without-xxx เพื่อปิดการใช้งานการสร้างพวกมัน ฉันคิดว่าทั้งหมด ยกเว้นคณิตศาสตร์ จำเป็นต้องมีส่วนประกอบของบุคคลที่สามเพิ่มเติม และคุณควรจะติดตั้งหากจำเป็นเท่านั้น - person Vladimir Prus; 18.09.2009

มีขั้นตอนง่ายๆ ที่ต้องปฏิบัติตามเพื่อข้าม build boost จาก linux ไปยัง windows ที่นี่:

https://web.archive.org/web/20110604002004/http://www.vle-project.org/wiki/Cross_compilation_Win32

person Elthariel    schedule 19.07.2010
comment
ดีมาก สิ่งนี้ยังคงใช้งานได้ (อย่างน้อยก็สร้างได้โดยไม่มีข้อผิดพลาด ยังไม่ได้ลองเรียกใช้)! - person Luminger; 27.04.2012
comment
ดูเหมือนว่าจะได้ผลสำหรับฉันเทียบกับการเพิ่ม 1.48.0 บน Ubuntu 12.04 Elthariel อาจเป็นความคิดที่ดีที่คุณจะขยายคำตอบให้รวมเนื้อหาของลิงก์นั้นไว้ในกรณีที่ลิงก์นั้นเก่า ฉันจะโหวตให้คุณถ้าคุณทำ - person Ryan V. Bissell; 20.06.2014
comment
ลิงค์ตาย จะทำอย่างไร - person Chris; 04.02.2016

นี่คือคำสั่งที่ฉันใช้ ฉันได้ทดสอบพวกมันเพื่อเพิ่ม 1.46 และ 1.49 แล้ว

ในการเริ่มต้น ให้สร้างลิงก์ไปยังคอมไพเลอร์ภายใน /usr/i686-w64-mingw32/bin คุณสามารถเรียกใช้สคริปต์นี้:

#!/bin/bash

binDir="/usr/bin"
destDir="/usr/i686-w64-mingw32/bin"

cd "$binDir"
mkdir -p "$destDir"

for name in $(ls i686-w64-mingw32*); do
    newName=$(echo "$name" | sed 's/i686-w64-mingw32-//g')
    if [ -f "$destDir/$newName" ]; then
        rm "$destDir/$newName"
    fi
    ln -s "$binDir/$name" "$destDir/$newName"
done

จากนั้นติดตั้ง bjam บน Ubuntu / debian จะรวมอยู่ในแพ็คเกจ "libboost1.48-dev"

apt-get install libboost1.48-dev

หากต้องการเสร็จสิ้น ให้รูทแล้วรัน

env PATH=/usr/i686-w64-mingw32/bin:$PATH bjam toolset=gcc target-os=windows variant=release threading=multi threadapi=win32 link=static --prefix=/usr/i686-w64-mingw32 -j 4 --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged install

เสร็จแล้ว !

person Congelli501    schedule 29.04.2012
comment
ฉันรู้ว่าเป็นเวลาสองปีแล้วตั้งแต่คำตอบของคุณ แต่: 'autoRegex' ที่คุณพูดถึงคืออะไร? ทำไมไม่ sed 's/i686-w64-mingw32-//g' ? - person Ryan V. Bissell; 20.06.2014
comment
มีสคริปต์อยู่ในคอมพิวเตอร์ของฉัน ซึ่งทำหน้าที่กระตุ้นข้อมูล ฉันแก้ไขคำตอบตามคำแนะนำของคุณ - person Congelli501; 20.06.2014
comment
ฉันได้รับข้อผิดพลาดต่อไปนี้: คุณสมบัติไม่ถูกต้อง '‹threadapi›win32': คุณลักษณะที่ไม่รู้จัก 'threadapi' แม้ว่าไลบรารี Boost จะเป็นเวอร์ชันที่ใหม่กว่าเล็กน้อย - person Seppo Enarvi; 06.02.2015

Boost สร้างสมมติฐานเกี่ยวกับระบบปฏิบัติการและบิวด์ปัจจุบันของคุณโดยอิงตามระบบปัจจุบันของคุณ จะเป็นอย่างไรหากคุณได้รับไฟล์ส่วนหัว win32 ลบส่วนหัว linux ทั้งหมดออกจากเส้นทางรวมแล้วลองสร้าง

person Kieveli    schedule 09.09.2009

นี่ไม่ใช่คำตอบจริงๆ แต่: อย่า!

การคอมไพล์ข้ามไปยังแพลตฟอร์มที่แตกต่างอย่างสิ้นเชิงมักจะสร้างความเจ็บปวดอย่างมากใน ****

หากคุณกำลังพยายามสร้างไบนารี่ของ windows บนเครื่องเดียวกัน เช่น สำหรับแพ็คเกจ ให้ใช้เครื่องเสมือนที่มี windows, mingw และสคริปต์ที่เหมาะสม

จากนั้น คุณยังสามารถเรียกใช้การทดสอบอัตโนมัติบน vm ฯลฯ ด้วยบิลด์ของคุณ ซึ่งน่าจะเป็นข้อได้เปรียบอย่างมาก

person AndreasT    schedule 09.09.2009
comment
ข้อดีของการรันการทดสอบอัตโนมัติได้ นั่นเป็นสิ่งที่ไม่สามารถทำได้ในสภาพแวดล้อมแบบข้ามคอมไพล์ - person Malvineous; 08.11.2010
comment
ถึงผู้ลงคะแนนเสียง: คุณช่วยระบุสิ่งที่คุณพบผิดเกี่ยวกับข้อความของฉันได้ไหม และโปรดทราบว่านี่ไม่ใช่คำนำคำตอบจริงๆ - person AndreasT; 29.04.2020
comment
ฉันไม่ได้ลงคะแนน แต่ Stack Overflow มุ่งเน้นไปที่คำถามและคำตอบอย่างมาก หากไม่ใช่คำตอบ หรือมีคนบอกว่าคำถามนั้นผิด (ตามที่โพสต์ของคุณแนะนำ) คุณจะได้รับคะแนนโหวต เนื่องจากผู้คนจำนวนมากมาจาก Google ที่ต้องการความช่วยเหลือเกี่ยวกับปัญหาเฉพาะ และการอ่านหนังสือไม่ได้ช่วยอะไรหากบุคคลนั้นมีกำหนดเวลาหรือข้อกำหนดอื่นๆ ที่ไม่มีทางเลือกให้พวกเขา โดยเฉพาะอย่างยิ่งในกรณีนี้ คุณกำลังบอกว่าผู้คนควรซื้อลิขสิทธิ์ Windows แทนที่จะแก้ไขปัญหาแบบฟรีๆ คุณควรโพสต์เป็นความคิดเห็นเกี่ยวกับคำถามแทน - person Malvineous; 30.04.2020