Cross-Platform Development in C++ This Page Intentionally Left Blank = Cross-Platform Development in C++ Building Mac OS X, Linux, and Windows Applications
Total Page:16
File Type:pdf, Size:1020Kb
= Cross-Platform Development in C++ This page intentionally left blank = Cross-Platform Development in C++ Building Mac OS X, Linux, and Windows Applications Syd Logan Upper Saddle River, NJ • Boston • Indianapolis • San Francisco New York • Toronto • Montreal • London • Munich • Paris • Madrid Cape Town • Sydney • Tokyo • Singapore • Mexico City Many of the designations used by manufacturers and sellers to distinguish their Editor-in-Chief products are claimed as trademarks. Where those designations appear in this book, Mark Taub and the publisher was aware of a trademark claim, the designations have been printed with initial capital letters or in all capitals. Acquisitions Editor Greg Doench The author and publisher have taken care in the preparation of this book, but make no expressed or implied warranty of any kind and assume no responsibility for errors Development Editor or omissions. No liability is assumed for incidental or consequential damages in Michael Thurston connection with or arising out of the use of the information or programs contained Managing Editor herein. Gina Kanouse The publisher offers excellent discounts on this book when ordered in quantity for Project Editor bulk purchases or special sales, which may include electronic versions and/or custom Anne Goebel covers and content particular to your business, training goals, marketing focus, and branding interests. For more information, please contact: Copy Editor Keith Cline U.S. Corporate and Government Sales (800) 382-3419 Indexer [email protected] Erika Millen For sales outside the United States please contact: Proofreader Kathy Ruiz International Sales [email protected] Technical Reviewers Jim Dunn Amy Fong Hang Lau Stephen Morse Lew Pitcher Sean Su Namachivayam Thirumazshusai Doug Turner Roy Yokohama Publishing Coordinator Andrea Bledsoe Cover Designer Gary Adair Visit us on the Web: www.informit.com/title/9780321246424 and www.crossplatformbook.com Composition Nonie Ratcliff Library of Congress Cataloging-in-Publication Data: Logan, Syd. Cross-platform development in C++ : building Mac OS X, Linux, and Windows applications / Syd Logan. p. cm. ISBN 0-321-24642-X (pbk. : alk. paper) 1. Cross-platform software development. 2. C++ (Computer program language) I. Title. QA76.76.D47L65 2007 005.13’3--dc22 2007036292 Copyright © 2008 Pearson Education, Inc. All rights reserved. Printed in the United States of America. This publication is protected by copyright, and permission must be obtained from the publisher prior to any prohibited reproduction, storage in a retrieval system, or transmission in any form or by any means, electronic, mechanical, photocopying, recording, or likewise. For information regarding permissions, write to: Pearson Education, Inc. Rights and Contracts Department 501 Boylston Street, Suite 900 Boston, MA 02116 Fax: (617) 671-3447 ISBN-13: 978-0-321-24642-4 ISBN-10: 0-321-24642-X Text printed in the United States on recycled paper at RR Donnelly in Crawfordsville, Indiana. First printing December 2007 This book is dedicated to all of the members of Netscape CPD and Mozilla, from whom I have learned so much. It was truly an honor to be a part of the team. = This page intentionally left blank = Contents Foreword . xiii Preface . xv Acknowledgments . xxiii About the Author . xxv Introduction . .1 Areas That Can Affect Software Portability . 3 The Role of Abstraction . 10 1 Policy and Management . 17 Item 1: Make All of Your Platforms a Priority . 17 Item 2: Code from a Common Codebase . 22 Platform Factory Implementations . 29 Implementation Classes . 31 Platform-Specific ProcessesImpl Classes . 32 Creating the Instance Hierarchy . 42 Organizing the Project in CVS or SVN . 45 Makefiles and Building the Code . 49 Item 3: Require Developers to Compile Their Code with Different Compilers . 52 Item 4: Require Developers to Build Their Code on Multiple Platforms . 56 Item 5: Test Builds on Each Supported Platform . 60 Item 6: Pay Attention to Compiler Warnings . 61 GNU Flags . 62 Microsoft Visual C++ . 63 vii viii Contents 2 Build System/Toolchain . 65 Item 7: Use Whatever Compiler Makes the Most Sense for a Platform . 66 Item 8: Use Native IDEs When Appropriate . 67 Item 9: Install and Use Cygwin on Windows . 71 Item 10: Use a Cross-Platform Make System . 76 Make . 77 Building on Windows . 81 Autoconf/Automake . 87 Imake . 91 Installing on Mac OS X . 91 Installing on Windows . 91 Using Imake, an Example . 93 Imakefiles . 94 Building a Complete Program from Multiple Sources . 95 Overriding Defaults with site.def . 99 Eliminating #ifdefs in Code . 101 Files Used by Imake . 107 Building Projects with Subdirectories . 108 Building Debug . 130 3 Software Configuration Management . 131 Item 11: Use a Cross-Platform Bug Reporting and Tracking System . 132 Accessibility . 133 Ability to Track Platform-Specific Bugs . 133 Bugzilla . 133 Item 12: Set Up a Tinderbox . 140 Item 13: Use CVS or Subversion to Manage Source Code . 147 Setting Up and Using CVS . 152 Item 14: Use Patch . 157 An Example . 158 Patch Options . 161 Dealing with Rejects . 162 Patch and Cross-Platform Development . 163 Contents ix 4 Installation and Deployment . 165 Item 15: Provide Support for Native Installers . 165 XPInstall . 166 Platform Installs . 170 5 Operating System Interfaces and Libraries . 221 Item 16: Use Standards-Based APIs (For Example, POSIX) . 222 POSIX . 222 Support for POSIX, SVID, XPG, and BSD . 226 Using Standards Support in GCC . 227 Microsoft Runtime Library Support for POSIX . 231 Using GCC on Microsoft Windows . 234 Deciding Which Standards to Support . 240 Item 17: Consider Using a Platform Abstraction Library Such as NSPR . 242 Why NSPR? . 242 NSPR Basics . 245 Threads . 249 Additional NSPR Functionality . 260 6 Miscellaneous Portability Topics . 273 Item 18: Take Care When Using Floating Point . 274 Don’t Serialize Floating-Point Values as Binary . 276 Equality . 277 Item 19: Be Explicit Regarding the Sign of Char Types . 278 Item 20: Avoid the Serialization of Binary Data . 280 Item 21: Avoid Problems Related to the Size and Organization of Types . 293 Size of Integer Types . 293 NSPR and Types . 296 Sizes and Efficiency . 297 Integer Conversions . 298 Struct Alignment and Ordering . 299 7 User Interfaces . 303 Item 22: Separate the User Interface from the Model . 304 Separating the User Interface and Application Logic with Model/View . 305 x Contents Using Publish/Subscribe to Communicate between the View and the Model . 318 Summary . 322 Item 23: Develop a Cross-Platform User Interface Strategy . 323 Issues Affecting Portable Cross-Platform GUI Development . 323 Choosing a GUI Strategy . 325 8 wxWidgets . ..