Tek bir yürütülebilir dosya geliştirirken farklı C ++ derleyicilerini ve dil sürümlerini kullanma


15

Firmamız uydu iletişimi için büyük ve çok karmaşık bir kaynak kodu satın alacaktır.

C ++ 'da kodlanmıştır ve kodumuzu satın alınan kodla tek bir yürütülebilir üniteye bağlayarak, C ++' da da kod ekleyeceğiz.

  • Satın alınan kodu geliştirmek için kullanılan aynı derleyici ve aynı derleyici sürümünü kullanmamız gerekli mi?

  • Satın alınan kodla aynı C ++ sürümünü kullanmamız gerekli mi? O 2014 kullanmıyorsa, biz _might_ bunun bazı özelliklerini kullanmak istiyorum, ancak farklı sürümleri karıştırma ile bazı sorunlar olabilir değilse.

Teorik olarak, elbette, özellikle dil versiyonunun önemli olmaması gerekir, ancak derleyicinin farklı versiyonlarının farklı nesne kodu üretmesi ve potansiyel olarak zamanlama farklılıklarına yol açması vb.

Nelerden haberdar olmalıyız?


7
Umarım sadece kaynak kodu satın almakla kalmaz, aynı zamanda (nitelikli kişiler tarafından) bazı destek satın alırsınız.
Basile Starynkevitch

1
Gerçekten de öyleyiz. Ve elbette, tedarikçinin bu sorusunu da sordum. Ama burada bunun iyi bir tartışma noktası olacağını ve gelecekte başkaları için iyi bir referans olacağını düşündüm.
Mawg, Monica

2
Üçüncü taraf kodunu desteklenmeyen bir derleyici kullanarak derlemekten mi bahsediyorsunuz, yoksa farklı kodları farklı derleyiciler kullanarak derlemekten mi bahsediyorsunuz (örneğin, satın aldığınız kod için desteklenen kodu ve kendi kodunuz için daha yeni bir kodu kullanmaktan) onları bağlama)? Yoksa sorunun bu kısmı arasında karar vermek mi?
jpmc26

3
Dil sürümü bile önemli olabilir , (eski) derleyici sürümlerinin listesi ve ABI'deki küçük farklılıklar için gcc.gnu.org/wiki/Cxx11AbiCompatibility'ye bakın . Başka bir deyişle: aynı derleyici, ancak farklı c ++ dil ayarı (c ++ 03 s c ++ 11) önemli olabilir.
André

2
Ve MSVC ile, standart kütüphane nesneleri boyunca (dinamik) kütüphane sınırları boyunca geçmek güvenli değildir. Örneğin, bkz. Stackoverflow.com/q/5661738/417197
André

Yanıtlar:


9

Satın alınan kodu geliştirmek için kullanılan aynı derleyici ve aynı derleyici sürümünü kullanmamız gerekli mi?

Değişir.

Derleyiciler bir ABI'yi hedefleyen kod oluşturur. Bazıları ortak bir ABI kullanıyor (örneğin, yanılmıyorsam, hem clang ++ hem de g ++ target Itanium ABI olarak adlandırılır) ve bunu yapmanıza engel olan hatalar olabilir - nesne kodunu kullanabilirsiniz her ikisinden de aynı programda (elbette ABI'nin aynı sürümünü hedefleyen sürümleri kullandığınız varsayılarak). Aynı şey derleyici sürümü için de geçerlidir: bazıları aynı ABI'yi sürüm arasında diğerlerinden daha fazla tutmaya dikkat eder. Açıkçası, hepsinin bir zamanlar ABI değişikliğine ihtiyacı vardır ve bunu uyumlu olmayan bir şekilde yapmaya zorlanabilirler. Ve açıkça, bir dil standardı seçimi gibi bazı ayarların ABI seçiminde bir etkisi olabilir.

Sonra standart kütüphane sorunu var. Derleyicilerin (veya aynı derleyicinin farklı sürümlerinin) kendileri aynı ABI'yi kullanabilir ve yine de standart kütüphaneleri uyumsuz olabilir (ve clang ++ gibi bazı derleyiciler birkaç standart kütüphaneyle kullanılabilir). Çalışmasını sağlamak, arayüzde kullanılan şeye bağlı olabilir.

Başka bir deyişle, kazmak ve bulunduğunuz spesifik durum için bilgi bulmak zorundayız. Bir başlangıç noktası ve tür bilgi için görünmesi gerektiğine dair bir örnek olarak, burada (++ libstdc tarafından g kullandığı kütüphane sağlanan bilgilerdir ++ ve bazı yapılandırmalarda clang ++ ile)


10
ABI = Uygulama İkili Arayüzü
Simon B

2
Bu cevap, nesne kodunun uyumluluğu ile ilgilidir. OP kaynak kodu satın alıyor .
Monica ile Hafiflik Yarışları

7
@LightnessRacesinOrbit Soru, tek bir yürütülebilir dosya oluşturmak için farklı derleyiciler kullanmaktan bahsediyor. "Üçüncü taraf kodunu bir derleyici (muhtemelen" desteklenen "bir kod) ve kendi kodunu farklı bir derleyici (muhtemelen daha yeni bir kod) ile derlemek demek büyük bir sıçrama değil." (Bu kesinlikle OP'nin sormasını anladığım şeydir; farklı okursanız, OP'den netleştirmesini isteyebilirsiniz.) Bu olasılıkla veya benzer olanlarda, nesne kodunun uyumluluğu son derece alakalı görünüyor.
jpmc26

1
@ jpmc26: "Bu kesinlikle OP'nin sormasını anladığım şey; farklı okursanız, OP'den netleştirmesini isteyebilirsiniz." OP, şirketlerinin "büyük ve çok karmaşık bir kaynak kodu satın alacağını" açıkça belirtti. Ayrıca, "derleyicinin farklı sürümlerinin zamanlama farklarına yol açabilecek farklı nesne kodları üretmesi mümkündür" gibi ifadelerle, satın alınan kodu sadece kendi araçlarıyla değil, farklı araç zincirleriyle derlediklerinde hangi değişikliklerin olduğunu soruyorlar. Orada yorum yapmak için fazla yer olduğunu sanmıyorum!
Monica ile Hafiflik Yarışları

8

Satın alınan kodu geliştirmek için kullanılan aynı derleyici ve aynı derleyici sürümünü kullanmamız gerekli mi? Satın alınan kodla aynı C ++ sürümünü kullanmamız gerekli mi?

Bu esas olarak teknik bir soru değildir. Bu, sözleşmenize ne yazdığınızla ilgili yasal bir sorudur. Yazılım satıcısının size ortamınızda kullanılabileceği garanti edilen bir sürüm sunduğundan emin olun . Aksi takdirde, her zaman farklı bir derleyici, derleyici sürümü veya dil sürümü ile sorun yaşama riski vardır.

Bu, bileşeni veya parçalarını kapalı kaynak olarak satın aldığınızda özellikle önemlidir. Tedarikçiniz, bileşeni mevcut derleyici ortamınızla kullanabileceğinizi garanti etse bile, gelecekte daha yeni bir derleyici sürümüne geçmek isterseniz size güncelleme sağlayacağını garanti ediyor mu? Tam kaynak koduna erişiminiz yoksa, herhangi bir uyumluluk sorununu kendiniz çözmeye çalışma şansınız olmayacaktır. Bu yüzden sadece yazılımı satın almamalı, aynı zamanda tedarikçinizle uzun vadeli bir bakım sözleşmesi düşünmelisiniz.


Bu aslında oldukça iyi bir tavsiye!
T. Sar

Gerçekten, ama ne yazık ki, çok geç. Basile'nin yorumuna da değindiğim gibi, tedarikçinin bu sorusunu da sordum. Ama burada iyi bir tartışma noktası ve gelecekte başkaları için iyi bir gelecek referans olacağını düşündük
Mawg yeniden aktifleştirme Monica diyor

4

Firmamız uydu iletişimi için büyük ve çok karmaşık bir kaynak kodu satın alacaktır. C ++ 'da kodlanmıştır ve kodumuzu satın alınan kodla tek bir yürütülebilir üniteye bağlayarak, C ++' da da kod ekleyeceğiz.

Kulağa iyi geliyor!

Satın alınan kodu geliştirmek için kullanılan aynı derleyici ve aynı derleyici sürümünü kullanmamız gerekli mi?

Genel olarak konuşmak gerekirse, hayır gerekli değildir. C ++ 'ın amacı, bu tür şeyler üzerinde bir soyutlama olarak hareket etmektir, bu nedenle iyi yazılmış bir C ++ programı, orijinal yazarın yaptığı gibi aynı şekilde zinciriniz üzerinde derlenecek ve ortaya çıkan program aynı sonuca sahip olacaktır. Performans farklı olabilir, çünkü farklı derleyiciler farklı şeylerde iyidir, ancak programın temel davranışı değişmemelidir.

Ancak, kötü yazılmış yazılımlar uygulamaya özgü davranışlara ve hatta tanımlanmamış davranışlara dayanabilir. Yerleşik türler veya platformun endianitesi hakkında varsayımlar yapabilir. İyi yazılmış yazılımların bile, seçtiğiniz araç zincirinde bulunmayan standart dışı uzantılara güvenmekten başka seçeneği olmayabilir veya bu süre içinde taşınabilirlik katmanı eklemek için zaman harcamanıza gerek olmadığından orijinal proje.

Sonuçta, kaynak kodun ne için yazıldığını yazar / satıcıya sormanız gerekir. Visual Studio 2015'e özel olarak yazıldığını ve Windows API özellikleri gerektirdiğini iddia ederse, muhtemelen buna uymalısınız. Ancak taşınabilir, standart C ++ olduğunu iddia ederse, istediğiniz derleyiciyi kullanın. Satın alma sözleşmenizin, satıcının yalan söylediğinde ücretsiz yardım alabilmeniz için bir destek düzenlemesi içerdiğinden emin olun.

Satın alınan kodla aynı C ++ sürümünü kullanmamız gerekli mi? O 2014 kullanmıyorsa, biz belki bunun bazı özelliklerini kullanmak istiyorum, ancak farklı sürümleri karıştırma ile bazı sorunlar olabilir değilse.

Muhtemelen. Olabilir.

C ++ 03 çoğunlukla ileri uyumludur, bu nedenle kod C ++ 03 ise, bir sorun yaşama olasılığınız yoktur. (Yine de bazı ince ayarlar gerekebilir.)

Ancak C ++ 11 ve C ++ 14'te sunulan özellikler geriye dönük olarak uyumlu değildir, bu nedenle satıcı, örneğin C ++ 11 lambdas kullandıysa ve kodlarını bir C ++ 03 derleyicisinde oluşturmaya çalışırsanız, çalışmıyor.

Teorik olarak, elbette, özellikle dil versiyonunun önemli olmaması gerekir, ancak derleyicinin farklı versiyonlarının farklı nesne kodu üretmesi ve potansiyel olarak zamanlama farklılıklarına yol açması vb.

Kesinlikle. Kod, beklenen sonuçları elde etmek için belirli bir uygulamaya çok fazla güveniyorsa, o zaman sorumlu olmak ve sizi bilgilendirmek satıcıya bağlıdır. Gerçek dünyada yaşadığımız için çalışkan olmayı ve önce onlara sormanızı öneririm.

Ve başkalarının söylediklerini yankılayacağım: bir çeşit destek başvurusuna sahip olduğunuzdan emin olun, böylece bu sorulara verilen cevapları (kasıtlı veya başka türlü) yanlış beyan ettiyse, sonuçta ortaya çıkan maliyeti omuzlandırmazsınız.


Dikkate değer: bağlantı tamamen C ++ spesifikasyonlarında yer almamaktadır. Kod, birden çok uyumlu derleyicide derlenebilse de, bunları birbirine bağlayabileceğiniz ve çalıştırabileceğiniz garanti edilmez.
Cort Ammon

1
@CortAmmon: Ortaya çıkan dağıtımın tüm bileşenlerini bir ABI paylaşan araç zincirleriyle derlemelisiniz. ABI standartları C ++ kapsamı dışındadır. OP'nin zaten takım zincirlerini karıştırmayı sorduğunu sanmıyorum.
Monica ile Hafiflik Yarışları

2

Kodu bağlamazsınız, derlenmiş nesne dosyalarını bağlarsınız.

Bu durumda evet, farklı düzeyde C ++ derleyicileri (hatta hata ayıklama / sürüm derlemeleri gibi ayarlar) veya bunların farklı sürümlerini veya ikili düzeyde etkileşime girecek parçaları oluştururken farklı standart sürümleri ( parçaları birbirinden daha fazla C API kullanarak iletişim kurarsa uygulama.

Kapsayıcılar veya istisnalar gibi özellikler aynı arabirimi sağlar, ancak ikili düzeyde birçok farklı, uyumsuz yolla uygulanabilir.

Bununla birlikte, tüm kodu derlemek için farklı bir derleyici kullanmak farklı bir sorundur. Dikkate alınacak sorular:

  • Kod hangi platformu / mimariyi hedefliyor?
  • Hangi standart için yazılmıştır?
  • Standart olmayan herhangi bir derleyici özelliği kullanıyor mu?
  • Kod, sabit kodlu platforma özgü varsayımlar içeriyor mu (her zaman işaretçilerin 2 bayt kapladığını düşünmek gibi)?

Kodun, tanımlanmamış davranışla sonuçlanan parçalar içermesi riski de vardır. Bir derleyici kullanırken bunlar iyi çalışıyor gibi görünebilir, ancak farklı bir derleyici kullanırken gizemli şekillerde başarısız olabilir.


OP, kodu değil, satıcıyı oluşturuyor. OP, derleme ortamının (satıcıya ait) değiştirilmesinin, aynı kod temeli verildiğinde kod üretimini nasıl etkileyebileceğini soruyor.
Monica ile Hafiflik Yarışları

1

Satın alınan kodu geliştirmek için kullanılan aynı derleyici ve aynı derleyici sürümünü kullanmamız gerekli mi?

Derleyiciyi değiştirmek, bazı sorunlara yol açabilir; Şu anda şirketimde, Clang ve MSVC kullanıyoruz ve bir derleyicide diğerinin böyle işaretlemediği hatası var.

Satın alınan kodla aynı C ++ sürümünü kullanmamız gerekli mi? O 2014 kullanmıyorsa, biz belki bunun bazı özelliklerini kullanmak istiyorum, ancak farklı sürümleri karıştırma ile bazı sorunlar olabilir değilse.

Gerekli değil, ama elbette derleyici kullanmak istediğiniz C ++ sürümünü desteklemelidir. C ++, tüm sürümlerden başlayarak retro uyumluluğu garanti eder.


Hemen hemen düşüncelerim. Derleyici sürümleri ne olacak - örneğin GCC x sürümünü kullanıyorsa ve en son sürümü x + 2 ise?
Mawg, Monica

1
Kullanmak istediğiniz derleyicinin daha eski bir sürümünü kullanıyorlarsa, sorun yoktur, çünkü kullanımdan kaldırılmış şeyler diye bir şey yoktur, derleyicinizin daha yeni bir sürümünü kullanıyorlarsa sorun ortaya çıkabilir.
LaboPie

Ama nasıl? Ben de woudl yapmamayı tercih ederim. Ancak ortaya çıkabilecek herhangi bir sorunun farkında mısınız?
Mawg, Monica

Ancak ortaya çıkabilecek herhangi bir sorunun farkında mısınız? Derleyicimizin desteklemeyeceği bir işlev kullanıyorlarsa, kod derlenmeyecektir.
LaboPie

1
Küçük bir ek, tabii ki diğer ofislerden kullanılan derleyici büyük değilse sorun daha da artar. EG eski bir konsol derleyicisi veya dil alt kümesiyle çalışan bir şey.
LaboPie

1

Derleyicileri değiştirirken büyük bir sorun tanımsız davranıştır: Aldığınız kod tanımsız davranış çağırıyorsa, kodun iyi çalıştığı ve derleyicilerini kullanırken tüm testlerini geçtiği ve derleyicinizle çok yanlış gittiğini de içeren her şey mümkündür.

Bu mümkündür, ancak bu durumda optimizasyon düzeylerini değiştirirseniz, aynı derleyicinin bir sonraki sürümünü vb. Kullanırsanız da sorun yaşayabilirsiniz. Yani kaçınabilecek bir şey yok.


Bu, tüysüz ve belki de valgrind kullanmak için iyi bir argüman .
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.