C++ Cookbook ™ www.it-ebooks.info
Other resources from O’Reilly Related titles C++ in a Nutshell C++ Pocket Reference UML 2.0 in a Nutshell Learning UML STL Pocket Reference Unit Test Frameworks Practical C++ Programming oreilly.com oreilly.com is more than a complete catalog of O'Reilly books. You’ll also find links to news, events, articles, weblogs, sample chapters, and code examples. oreillynet.com is the essential portal for developers interested in open and emerging technologies, including new platforms, pro- gramming languages, and operating systems. Conferences O’Reilly brings diverse innovators together to nurture the ideas that spark revolutionary industries. We specialize in document- ing the latest tools and systems, translating the innovator’s knowledge into useful skills for those in the trenches. Visit con- ferences.oreilly.com for our upcoming events. Safari Bookshelf (safari.oreilly.com) is the premier online refer- ence library for programmers and IT professionals. Conduct searches across more than 1,000 books. Subscribers can zero in on answers to time-critical questions in a matter of seconds. Read the books on your Bookshelf from cover to cover or sim- ply flip to the page you need. Try it today with a free trial. www.it-ebooks.info
C++ Cookbook ™ D. Ryan Stephens, Christopher Diggins, Jonathan Turkanis, and Jeff Cogswell Beijing • Cambridge • Farnham • Köln • Paris • Sebastopol • Taipei • Tokyo www.it-ebooks.info
C++ Cookbook™ by D. Ryan Stephens, Christopher Diggins, Jonathan Turkanis, and Jeff Cogswell Copyright © 2006 O’Reilly Media, Inc. All rights reserved. Printed in the United States of America. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. O’Reilly books may be purchased for educational, business, or sales promotional use. Online editions are also available for most titles (safari.oreilly.com). For more information, contact our corporate/insti- tutional sales department: (800) 998-9938 or corporate@oreilly.com. Editor: Jonathan Gennick Production Editor: Matt Hutchinson Production Services: Octal Publishing, Inc. Cover Designer: Karen Montgomery Interior Designer: David Futato Printing History: November 2005: First Edition. Nutshell Handbook, the Nutshell Handbook logo, and the O’Reilly logo are registered trademarks of O’Reilly Media, Inc. The Cookbook series designations, C++ Cookbook, the image of a collie, and related trade dress are trademarks of O’Reilly Media, Inc. Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this book, and O’Reilly Media, Inc. was aware of a trademark claim, the designations have been printed in caps or initial caps. While every precaution has been taken in the preparation of this book, the publisher and authors assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein. This book uses RepKover™, a durable and flexible lay-flat binding. ISBN-10: 0-596-00761-2 ISBN-13: 978-0-596-00761-4 [M]‘ [9/07] www.it-ebooks.info
v Table of Contents Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi 1. Building C++ Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1 Obtaining and Installing GCC 15 1.2 Building a Simple “Hello, World” Application from the Command Line 18 1.3 Building a Static Library from the Command Line 23 1.4 Building a Dynamic Library from the Command Line 25 1.5 Building a Complex Application from the Command Line 33 1.6 Installing Boost.Build 38 1.7 Building a Simple “Hello, World” Application Using Boost.Build 40 1.8 Building a Static Library Using Boost.Build 44 1.9 Building a Dynamic Library Using Boost.Build 45 1.10 Building a Complex Application Using Boost.Build 46 1.11 Building a Static Library with an IDE 50 1.12 Building a Dynamic Library with an IDE 53 1.13 Building a Complex Application with an IDE 57 1.14 Obtaining GNU make 62 1.15 Building A Simple “Hello, World” Application with GNU make 64 1.16 Building a Static Library with GNU Make 72 1.17 Building a Dynamic Library with GNU Make 77 1.18 Building a Complex Application with GNU make 78 1.19 Defining a Macro 82 1.20 Specifying a Command-Line Option from Your IDE 84 1.21 Producing a Debug Build 85 1.22 Producing a Release Build 89 1.23 Specifying a Runtime Library Variant 92 www.it-ebooks.info
vi | Table of Contents 1.24 Enforcing Strict Conformance to the C++ Standard 95 1.25 Causing a Source File to Be Linked Automatically Against a Specified Library 99 1.26 Using Exported Templates 101 2. Code Organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 2.1 Making Sure a Header File Gets Included Only Once 107 2.2 Ensuring You Have Only One Instance of a Variable Across Multiple Source Files 108 2.3 Reducing #includes with Forward Class Declarations 110 2.4 Preventing Name Collisions with Namespaces 111 2.5 Including an Inline File 118 3. Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 3.1 Converting a String to a Numeric Type 120 3.2 Converting Numbers to Strings 123 3.3 Testing Whether a String Contains a Valid Number 126 3.4 Comparing Floating-Point Numbers with Bounded Accuracy 129 3.5 Parsing a String Containing a Number in Scientific Notation 131 3.6 Converting Between Numeric Types 133 3.7 Getting the Minimum and Maximum Values for a Numeric Type 136 4. Strings and Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 4.1 Padding a String 140 4.2 Trimming a String 142 4.3 Storing Strings in a Sequence 147 4.4 Getting the Length of a String 151 4.5 Reversing a String 153 4.6 Splitting a String 154 4.7 Tokenizing a String 157 4.8 Joining a Sequence of Strings 159 4.9 Finding Things in Strings 162 4.10 Finding the nth Instance of a Substring 165 4.11 Removing a Substring from a String 167 4.12 Converting a String to Lower- or Uppercase 168 4.13 Doing a Case-Insensitive String Comparison 171 4.14 Doing a Case-Insensitive String Search 173 4.15 Converting Between Tabs and Spaces in a Text File 175 4.16 Wrapping Lines in a Text File 178 www.it-ebooks.info
Table of Contents | vii 4.17 Counting the Number of Characters, Words, and Lines in a Text File 180 4.18 Counting Instances of Each Word in a Text File 183 4.19 Add Margins to a Text File 185 4.20 Justify a Text File 188 4.21 Squeeze Whitespace to Single Spaces in a Text File 190 4.22 Autocorrect Text as a Buffer Changes 191 4.23 Reading a Comma-Separated Text File 194 4.24 Using Regular Expressions to Split a String 196 5. Dates and Times . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 5.1 Obtaining the Current Date and Time 198 5.2 Formatting a Date/Time as a String 201 5.3 Performing Date and Time Arithmetic 204 5.4 Converting Between Time Zones 205 5.5 Determining a Day’s Number Within a Given Year 207 5.6 Defining Constrained Value Types 208 6. Managing Data with Containers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 6.1 Using vectors Instead of Arrays 214 6.2 Using vectors Efficiently 218 6.3 Copying a vector 222 6.4 Storing Pointers in a vector 224 6.5 Storing Objects in a list 226 6.6 Mapping strings to Other Things 231 6.7 Using Hashed Containers 237 6.8 Storing Objects in Sorted Order 242 6.9 Storing Containers in Containers 245 7. Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 7.1 Iterating Through a Container 249 7.2 Removing Objects from a Container 256 7.3 Randomly Shuffling Data 259 7.4 Comparing Ranges 260 7.5 Merging Data 264 7.6 Sorting a Range 268 7.7 Partitioning a Range 271 7.8 Performing Set Operations on Sequences 272 7.9 Transforming Elements in a Sequence 276 www.it-ebooks.info
viii | Table of Contents 7.10 Writing Your Own Algorithm 278 7.11 Printing a Range to a Stream 281 8. Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 8.1 Initializing Class Member Variables 286 8.2 Using a Function to Create Objects (a.k.a. Factory Pattern) 289 8.3 Using Constructors and Destructors to Manage Resources (or RAII) 291 8.4 Automatically Adding New Class Instances to a Container 294 8.5 Ensuring a Single Copy of a Member Variable 296 8.6 Determining an Object’s Type at Runtime 297 8.7 Determining if One Object’s Class Is a Subclass of Another 299 8.8 Giving Each Instance of a Class a Unique Identifier 301 8.9 Creating a Singleton Class 303 8.10 Creating an Interface with an Abstract Base Class 306 8.11 Writing a Class Template 310 8.12 Writing a Member Function Template 315 8.13 Overloading the Increment and Decrement Operators 318 8.14 Overloading Arithmetic and Assignment Operators for Intuitive Class Behavior 320 8.15 Calling a Superclass Virtual Function 328 9. Exceptions and Safety . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 9.1 Creating an Exception Class 330 9.2 Making a Constructor Exception-Safe 335 9.3 Making an Initializer List Exception-Safe 338 9.4 Making Member Functions Exception-Safe 341 9.5 Safely Copying an Object 346 10. Streams and Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 10.1 Lining Up Text Output 352 10.2 Formatting Floating-Point Output 356 10.3 Writing Your Own Stream Manipulators 359 10.4 Making a Class Writable to a Stream 363 10.5 Making a Class Readable from a Stream 366 10.6 Getting Information About a File 368 10.7 Copying a File 370 10.8 Deleting or Renaming a File 374 10.9 Creating a Temporary Filename and File 376 10.10 Creating a Directory 378 www.it-ebooks.info
Table of Contents | ix 10.11 Removing a Directory 380 10.12 Reading the Contents of a Directory 383 10.13 Extracting a File Extension from a String 385 10.14 Extracting a Filename from a Full Path 386 10.15 Extracting a Path from a Full Path and Filename 388 10.16 Replacing a File Extension 389 10.17 Combining Two Paths into a Single Path 390 11. Science and Mathematics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 11.1 Computing the Number of Elements in a Container 395 11.2 Finding the Greatest or Least Value in a Container 396 11.3 Computing the Sum and Mean of Elements in a Container 399 11.4 Filtering Values Outside a Given Range 402 11.5 Computing Variance, Standard Deviation, and Other Statistical Functions 403 11.6 Generating Random Numbers 407 11.7 Initializing a Container with Random Numbers 409 11.8 Representing a Dynamically Sized Numerical Vector 410 11.9 Representing a Fixed-Size Numerical Vector 412 11.10 Computing a Dot Product 415 11.11 Computing the Norm of a Vector 416 11.12 Computing the Distance Between Two Vectors 417 11.13 Implementing a Stride Iterator 419 11.14 Implementing a Dynamically Sized Matrix 423 11.15 Implementing a Constant-Sized Matrix 426 11.16 Multiplying Matricies 429 11.17 Computing the Fast Fourier Transform 431 11.18 Working with Polar Coordinates 433 11.19 Performing Arithmetic on Bitsets 435 11.20 Representing Large Fixed-Width Integers 439 11.21 Implementing Fixed-Point Numbers 443 12. Multithreading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 12.1 Creating a Thread 447 12.2 Making a Resource Thread-Safe 450 12.3 Notifying One Thread from Another 458 12.4 Initializing Shared Resources Once 462 12.5 Passing an Argument to a Thread Function 463 www.it-ebooks.info
x | Table of Contents 13. Internationalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 13.1 Hardcoding a Unicode String 467 13.2 Writing and Reading Numbers 468 13.3 Writing and Reading Dates and Times 472 13.4 Writing and Reading Currency 477 13.5 Sorting Localized Strings 481 14. XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 14.1 Parsing a Simple XML Document 485 14.2 Working with Xerces Strings 494 14.3 Parsing a Complex XML Document 496 14.4 Manipulating an XML Document 508 14.5 Validating an XML Document with a DTD 512 14.6 Validating an XML Document with a Schema 517 14.7 Transforming an XML Document with XSLT 520 14.8 Evaluating an XPath Expression 527 14.9 Using XML to Save and Restore a Collection of Objects 533 15. Miscellaneous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539 15.1 Using Function Pointers for Callbacks 539 15.2 Using Pointers to Class Members 541 15.3 Ensuring That a Function Doesn’t Modify an Argument 544 15.4 Ensuring That a Member Function Doesn’t Modify Its Object 546 15.5 Writing an Operator That Isn’t a Member Function 548 15.6 Initializing a Sequence with Comma-Separated Values 550 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 www.it-ebooks.info
This is the Title of the Book, eMatter Edition Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved. xi Preface C++ runs on virtually every platform and in an infinite number of applications. If you bought or might buy this book, you are probably an engineer or researcher writ- ing one of these applications. But regardless of what you are writing and what plat- form you are targeting, odds are that you will be re-solving many of the same problems that other C++ programmers have been solving for years. What we have done in this book is solve many of these common problems and explain each of the solutions. Whether you have been programming in C++ for years or are relatively new to the language, you are probably familiar with the things you have rewrite on each new project: Date and time parsing/arithmetic, manipulating string and text, working with files, parsing XML, using the standard containers, and so on. These are the kinds of problems this book contains solutions for. In some cases (e.g., date and time arithmetic), the standard library contains very little support. In others (e.g., string manipulation) the standard library contains functionally rich classes, but it can’t do everything and some very common tasks are cumbersome. The format is straightforward. Each recipe has a problem statement and a code solu- tion, and most have a discussion that follows. We have tried to be pragmatic and solve the problems at hand without digressing too far, but in many cases there are related topics that are so useful (or just cool) that we have to provide a page or two of explanation. This is a book about solving common problems with C++, but not a book about learning C++. We assume that you have at least a basic knowledge of C++ and object-oriented programming. In particular, it will be helpful if you have at least some familiarity with: • C++ inheritance and virtual functions • The standard library www.it-ebo ks.info
This is the Title of the Book, eMatter Edition Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved. xii | Preface • Components of the Standard Template Library (containers, iterators, and algorithms) • Templates These are not strict prerequisites for reading this book, but having at least a basic knowledge of them will help. About the Examples In crafting our code examples, we strove for simplicity, portability, and perfor- mance. The design for each solution followed a similar path: use standard C++ (lan- guage or library) if possible; if not, use a de facto standard as the replacement. For example, many of the recipes that deal with strings use the standard string class, and most of the mathematical and scientific recipes use standard numeric types, contain- ers, and templates. The standard library has strong support for these areas, so stan- dard facilities are a perfect fit. By comparison, however, C++ has little or no standardized support for multithreading or XML parsing. Thus, we used the multi- threading support provided in the Boost Threads library and the XML parsing func- tionality provided by the Xerces parser. Often, there are many ways to do the same thing in C++, which gives developers flexibility, but also invites some controversy. Most of the examples illustrate the best general solution we could come up with, but that doesn’t mean that it’s the best solution ever. If there are alternative solutions that are better in some ways and not as good in others (maybe the solution that uses the standard library is awkward or unintuitive; in this case, we may provide an alternative that uses Boost), we present the alternative anyway to give you some insight into the various solutions that are available. Lots of the examples use templates. If you don’t have much experience writing tem- plates, you should get some soon. There is very little introductory material on tem- plates in this book, except for two recipes in Chapter 8: 8.11 and 8.12. Most of the interesting developments in C++ are in the areas of template metaprogramming and policy-based design. At the time of this writing, there is a lot of movement in the C++ community. The first technical report (called TR1) is more or less stable. It is a standardized list of fea- tures that will be eventually added to the next version of the C++ standard. It is not required that standard library implementations support it, but many vendors have already begun implementing TR1 and you can expect to see it appearing in shipped compilers soon. Many of the libraries in TR1 first appeared in the Boost project. We use libraries from Boost a lot. Boost is a set of open source, peer-reviewed, porta- ble libraries that fill in many of the gaps in the standard library. The current version as of this writing is 1.32, and 1.33 should be out any time now. We provide many www.it-ebo ks.info
This is the Title of the Book, eMatter Edition Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved. Preface | xiii pointers to specific Boost libraries in the examples. For more information on Boost in general, check out the project web site at www.boost.org. Conventions Used in This Book The following typographical conventions are used in this book: Italic Indicates new terms, URLs, email addresses, filenames, file extensions, path- names, directories, Unix utilities, commands, and command-line parameters. <...> Angle-brackets surround elements that you need to specify in commands and command-line parameters when those elements appear inline, in italics. Constant width Indicates code or fragments thereof. For example, class names, method names, and the like are rendered in constant width whenever they appear in the text. Constant width bold Shows user-input in mixed, input/output examples. Constant width italic Indicates user-specified items in syntax examples. Indicates a tip, suggestion, or general note. Indicates a warning or caution. Using Code Examples This book is designed to help you get your job done. In general, you may use the code in this book in your programs and documentation. You do not need to contact us for permission unless you’re reproducing a significant portion of the code. For example, writing a program that uses several chunks of code from this book does not require permission. Selling or distributing a CD-ROM of examples from O’Reilly books does require permission. Answering a question by citing this book and quot- ing example code does not require permission. Incorporating a significant amount of example code from this book into your product’s documentation does require permission. We appreciate, but do not require, attribution. An attribution usually includes the title, author, publisher, and ISBN. For example: “C++ Cookbook by D. Ryan www.it-ebo ks.info
This is the Title of the Book, eMatter Edition Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved. xiv | Preface Stephens, Christopher Diggins, Jonathan Turkanis, and Jeff Cogswell. Copyright 2006 O’Reilly Media, Inc., 0-596-00761-2.” If you feel your use of code examples falls outside fair use or the permission given above, feel free to contact us at permissions@oreilly.com. Comments and Questions Please address comments and questions concerning this book to the publisher: O’Reilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472 (800) 998-9938 (in the United States or Canada) (707) 829-0515 (international or local) (707) 829-0104 (fax) We have a web page for this book, where we list errata, examples, and any addi- tional information. You can access this page at: http://www.oreilly.com/catalog/cplusplusckbk To comment or ask technical questions about this book, send email to: bookquestions@oreilly.com For more information about our books, conferences, Resource Centers, and the O’Reilly Network, see our web site at: http://www.oreilly.com Safari Enabled When you see a Safari® Enabled icon on the cover of your favorite tech- nology book, that means the book is available online through the O’Reilly Network Safari Bookshelf. Safari offers a solution that’s better than e-books. It’s a virtual library that lets you easily search thousands of top tech books, cut and paste code samples, download chapters, and find quick answers when you need the most accurate, current informa- tion. Try it for free at http://safari.oreilly.com. www.it-ebo ks.info
This is the Title of the Book, eMatter Edition Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved. Preface | xv Acknowledgments From D. Ryan Stephens The most important people I have to thank are my wife, Daphne, and my chil- dren, Jesse, Pascal, and Chloe. Writing a book is hard work, but above all it is time-consuming work, and my family has been supportive and has tolerated my late nights in the office in the best possible way. I also have to thank the technical reviewers, who made this book better than it other- wise would have been. As with so many things, it is always helpful to have a second, third, and fourth set of eyes look over something for clarity and correctness. Many thanks to Dan Saks, Uwe Schnitker, and David Theese. Finally, I have to thank my editor, Jonathan Gennick, for his advice, which was mostly grammatical, frequently stylistic, occasionally psychologically supportive, and always good. From Christopher Diggins I wish to thank Kris Unger, Jonathan Turkanis, Jonathan Gennick, and Ryan Stephens for their helpful suggestions and critiques, and making me a better writer for it. A very special thanks to my wife Mélanie Charbonneau for brightening my life. From Jonathan Turkanis Because my chapters touched on so many different commerical products and open source projects—and because I had so many questions about each of them—I have an unusually large number of people to thank. Let me first thank Ron Liechty, Howard Hinnant, and the engineers at Metrowerks for answering every conceivable question and for providing me with several versions of CodeWarrior. I’d also like to thank the Boost.Build developers, especially Vladimir Prus, Rene Rivera, and David Abrahams, not just for answering my questions but also for putting together the Boost build system, which was the single most important source of information for Chapter 1. Thanks also to Walter Bright at Digital Mars; Greg Comeau at Comeau Computing; P. J. Plauger at Dinkumware; Colin Laplace at Bloodshed Software; Ed Mulroy and Pavel Vozenilek at the borland.public.* newsgroups; Arnaud Debaene and Igor Tandetnik at microsoft.public.vc.languages; Earnie Boyd, Greg Chicares, Adib Taraben, www.it-ebo ks.info
This is the Title of the Book, eMatter Edition Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved. xvi | Preface John Vandenberg, and Lennart Borgman at the MinGW/MSYS mailing list; Christopher Faylor, Larry Hall, Igor Pechtchanski, Joshua Daniel Franklin, and Dave Korn at the Cygwin list; Mike Stump and Geoffrey Keating at the GCC developers list; Mark Goodhand at DecisionSoft; and David N. Bertoni at apache.org. I’m also indebted to Robert Mecklenburg, whose book Managing Projects with GNU make, Third Edition (O’Reilly) provided the foundation for my treatment of GNU make. In addition, Vladimir Prus, Matthew Wilson, Ryan Stephens, and Christopher Diggins provided detailed criticism of early drafts of the manuscript. Finally, I must thank my editor, Jonathan Gennick, my wife, Jennifer, and my Grandfather, Louis S. Goodman, who taught me how to write. www.it-ebo ks.info
This is the Title of the Book, eMatter Edition Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved. 1 Chapter 1 CHAPTER 1 Building C++ Applications 1.0 Introduction to Building This chapter contains recipes for transforming C++ source code into executable pro- grams and libraries. By working through these recipes, you’ll learn about the basic tools used to build C++ applications, the various types of binary files involved in the build process, and the systems that have been developed to make building C++ applications manageable. If you look at the titles of the recipes in this chapter, you might get the impression that I solve the same problems over and over again. You’d be right. That’s because there are many ways to build C++ applications, and while I can’t cover them all, I try to cover some of the most important methods. In the first dozen or so recipes, I show how to accomplish three fundamental tasks—building static libraries, building dynamic libraries, and building executables—using a variety of methods. The reci- pes are grouped by method: first, I look at building from the command line, then with the Boost build system (Boost.Build), and then with an Integrated Develop- ment Environment (IDE), and finally with GNU make. Before you start reading recipes, be sure to read the following introductory sections. I’ll explain some basic terminology, provide an overview of the command-line tools, build systems and IDEs covered in the chapter, and introduce the source code examples. Even if you’ll be using a build system or IDE, you should start by read- ing the recipes on building from the command line: these recipes introduce some essential concepts that you’ll need to understand later in this chapter. www.it-ebo ks.info
This is the Title of the Book, eMatter Edition Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved. 2 | Chapter 1: Building C++ Applications Basic Terminology The three basic tools used to build C++ applications are the compiler, the linker, and the archiver (or librarian). A collection of these programs and possibly other tools is called a toolset. The compiler takes C++ source files as input and produces object files, which con- tain a mixture of machine-executable code and symbolic references to functions and data. The archiver takes a collection of object files as input and produces a static library, or archive, which is simply a collection of object files grouped for convenient use. The linker takes a collection of object files and libraries and resolves their sym- bolic references to produce either an executable or dynamic library. Roughly speak- ing, the linker operates by matching each use of a symbol to its definition. When an executable or dynamic library is created, it is said to be linked; the libraries used to build the executable or dynamic library are said to be linked against. An executable, or application, is simply any program that can be executed by the oper- ating system. A dynamic library, also called a shared library, is like an executable except that it can’t be run on its own; it consists of a body of machine-executable code that is loaded into memory after an application is started and can be shared by one or more applications. On Windows, dynamic libraries are also called dynamic link libraries (DLLs). The object files and static libraries on which an executable depends are needed only when the executable is built. The dynamic libraries on which an executable depends, however, must be present on a user’s system when the executable is run. Table 1-1 shows the file extensions typically associated with these four basic types of files on Microsoft Windows and Unix. When I mention a file that has a different extension on Windows and Unix, I’ll sometimes omit the extension if it’s clear from the context. In this chapter, whenever I say Unix, I mean Linux, too. Table 1-1. File extensions on Windows and Unix File type Windows Mac OS X Other Unix Object files .obj .o .o Static libraries .lib .a .a Dynamic libraries .dll .dylib .so Executables .exe No extension No extension www.it-ebo ks.info
Comments 0
Loading comments...
Reply to Comment
Edit Comment