由于中文版只找到扫描版的,浏览体验不佳,我打算手动录入一部分内容(主要偏向于GNU GCC 和 Makefile)
如果你们有中文文字版的,请告诉我,试打了一部分章节,真的很累。 =_=
略过的部分用类似如下的边界线作为标识
最后,码字上来只是为了交流学习,如果涉及到版权问题,请告知。======== 此处略过 ========
随书代码
最后,码字上来只是为了交流学习,如果涉及到版权问题,请告知。======== 此处略过 ========
注意:在本章中,如果提到Unix,则同样适用于Linux。文件类型 Windows Mac OS X Other Unix 目标文件 .obj .o .o 静态库 .lib .a .a 动态库 .dll .dylib .so 可执行程序 .exe 无扩展名 无扩展名
表1-3 命令行工具的位置工具集 编译器 链接器 归档器 GCC g++[.exe] g++ ar[.exe]ranlib[.exe] Visual C++ cl.exe link.exe lib.exe Intel (Windows) icl.exe xilink.exe xilib.exe Intel (Linux) Icpc icpc arranlib Metrowerks mwcc[.exe] mwld[.exe] mwld[.exe] Comeau como[.exe] como[.exe] Toolset-dependent Borland bcc32.exe bcc32.exe ilink32.exe tlib.exe Digital Mars dmc.exe link.exe lib.exe
GNU编译器集(GCC)工具集 位置 GCC (Unix) 通常为 /usr/bin or /usr/local/bin GCC (Cygwin) Cygwin安装目录下的bin子目录 GCC (MinGW) MinGW安装目录下的bin子目录 Visual C++ Visual Studio 安装位置下的 VC/bin Intel (Windows) Intel编译器安装位置下的bin子目录 Intel (Linux) Intel编译器安装位置下的bin子目录 Metrowerks CodeWarrior安装位置下的其他Metrowerks工具/命令行的Tools子目录 Comeau Comeau安装位置下的bin子目录 Borland C++Builder, C++BuilderX 或 Borland命令行安装位置下的bin子目录
编译和链接hello.cpp的命令如表1-6所示。要使这些命令正确运行,应使当前目录是含有hello.cpp的目录,且包含命令行编译器的目录应出现在PATH环境变量中。如果已在第1步中运行了脚本程序,那么后面的条件将自动满足。也有可能在你安装工具集时,安装程序就把包含命令行工具的目录添加到PATH中了。如果不是这样,你就得如表1-7所示的那样把目录添加到PATH中,或在命令行中指定完整的路径名。[ascii]工具集 脚本
Visual C++ vcvars32.bat
Intel (Windows) iclvars.bat
Intel (Linux) iccvars.sh 或 iccvars.csh
Metrowerks (Mac OS X) mwvars.sh 或 mwvars.csh
Metrowerks (Windows) cwenv.bat
Comeau Same as the backend toolset[/ascii]
表1-7 把目录添加到PATH环境变量[ascii]工具集 命令行
GCC g++ -o hello hello.cpp
Visual C++ cl -nologo -EHsc -GR -Zc:forScope -Zc:wchar_t -Fehello hello.cpp
Intel (Windows) icl -nologo -EHsc -GR -Zc:forScope -Zc:wchar_t -Fehello hello.cpp
Intel (Linux) icpc -o hello hello.cpp
Metrowerks mwcc -wchar_t on -cwd include -o hello hello.cpp
Comeau como -o hello hello.cpp
Borland bcc32 -q -ehello hello.cpp
Digital Mars dmc -Ae -Ar -I<dmcroot>/stlport/stlport -o hello hello.cpp[/ascii]
例如,如果你使用的是Microsoft Visual Studio .NET 2003,且是安装在C盘上的标准目录下,那么就可以切换到含有hello.cpp的目录下,输入如下命令:[ascii]外壳程序 命令行
bash, sh, ksh (Unix) export PATH=<directory>:$PATH
csh, tsch (Unix) setenv PATH <directory>:$PATH
cmd.exe (Windows) set PATH=<directory>;%PATH%[/ascii]
现在可以运行程序:> "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\ vcvars32.bat" Setting environment for using Microsoft Visual Studio .NET 2003 tools. (If you have another version of Visual Studio or Visual C++ installed and wish to use its tools from the command line, run vcvars32.bat for that version.) > cl -nologo -EHsc -GR -Zc:forScope -Zc:wchar_t -Fehello hello.cpp hello
同样,如果你使用的是Intel 9.0 for Linux,且如果是安装在标准位置/opt/intel/cc/9.0下面,那么就可以打开bash外壳程序,切换到含有hello.cpp的目录,并输入如下命令:> hello Hello, World!
===============================$ . /opt/intel/cc/9.0/bin/iccvars.sh $ icpc -o hello hello.cpp $ ./hello Hello, World!
接下来,让我们来看看原始问题的另一种解决方案。这种解决方案不是用单个命令来编译和链接,而是把第2步分割成一下两部分:? 选项 -nologo (Visual C++和Intel for Windows) 和 -q (Borland) 告诉编译器不显示其名字和版本号。这使得编译器的输出更易读。
? 选项 -EHsc (Visual C++和Intel for windows) 和 -Ae (Digital Mars) 告诉编译器启用C++异常处理。
? 选项 -GR (Visual C++和Intel for windows) 和 -Ar (Digital Mars) 告诉编译器启用运行时类信息 (RTTI)。
? 选项 -Zc:wchar_t (Visual C++和Intel for windows) 和 -wchar_t on (Metrowerks)告诉编译器把 wchar_t 识别为内置类型
? 选项 -Zc:forScope (Visual C++和Intel for windows) 告诉编译器要严格遵守 for-scoping 规则。
? 选项 -cwd include (Metrowerks) 告诉编译器,在含有 include 指令的源文件目录中开始查找一个包含的头文件
表 1-9 用于链接 hello.exe 或 hello 的命令[ascii]工具集 命令行
GCC g++ -c -o hello.o hello.cpp
Visual C++ cl -c -nologo -EHsc -GR -Zc:forScope -Zc:wchar_t -Fohello hello.cpp
Intel (Windows) icl -c -nologo -EHsc -GR -Zc:forScope -Zc:wchar_t -Fohello hello.cpp
Intel (Linux) icpc -c -o hello.o hello.cpp
Metrowerks mwcc -c -wchar_t on -cwd include -o hello.o[bj]hello.cpp
Comeau como -c -o hello.o[bj] hello.cpp
Borland bcc32 -c -q -o hello.obj hello.cpp
Digital Mars dmc -c -Ae -Ar -I<dmcroot>/stlport/stlport -o hello.obj hello.cpp[/ascii]
例如,要用GCC工具集来构建可执行程序hello,先切换到含有hello.cpp 文件的目录下,然后输入命令:[ascii]工具集 命令行
GCC g++ -o hello hello.o
Visual C++ link -nologo -out:hello.exe hello.obj
Intel (Windows) xilink -nologo -out:hello.exe hello.obj
Intel (Linux) icpc -o hello hello.o
Metrowerks mwld -o hello hello.o[bj]
Comeau como no_prelink_verbose -o hello hello.o[bj]
Borland bcc32 -q -ehello hello.cpp
Digital Mars link -noi hello.obj, hello.exe,NUL,user32.lib kernel32.lib,,[/ascii]
现在可以运行该程序:$ g++ -c -o hello.o hello.cpp $ g++ -o hello hello.o
表1-9 与表1-6几乎相同,只有两处不同。首先,选项-c 用于告诉编译器只编译而不链接。其次,指定输出文件为目标文件hello.obj或hello.o,而不是可执行程序。大多数编译器使用-o <file>来指定输出文件,但Visual C++和Intel for Windows 使用选项 -Fo<file>。而且,除Visual C++ 和 Intel for Windows 外,所有编译器都要求指定目标文件的扩展名。$ ./hello Hello, World!
该程序本来可以写成一个源文件,但我把它分成了三个模块:静态库 libjohnpaul、动态库libgeorgeringo,以及可执行程序hellobeatles。而且,尽管每个库都可以很容易地实现为单个的头文件和.cpp文件,但我把实现分成了许多个源文件,用于演示如何编译和链接含有多个源文件的项目。John, Paul, George and Ringo
johnpaul()的实现又分成两个源文件john.cpp和paul.cpp,每个源文件都只负责显示单个人名。John, Paul,
同样,georgeringo()的实现也分成了两个源文件 george.cpp 和 ringo.cpp。George, and Ringo
例如,要用GCC把 john.cpp、paul.cpp 和 johnpaul.cpp 编译成目标文件,切换到 johnpaul 目录,输入如下命令来产生 john.o、paul.o 和 johnpaul.o 目标文件:工具集 命令行 GCC (Unix)Intel (Linux)Comeau (Unix) ar ru libjohnpaul.a john.o paul.o johnpaul.o ranlib libjohnpaul.a GCC (Windows) ar ru libjohnpaul.a john.o paul.o johnpaul.o Visual C++Comeau (with Visual C++) lib -nologo -out:libjohnpaul.lib john.obj paul.obj johnpaul.obj Intel (Windows) xilib -nologo /out:libjohnpaul.lib john.obj paul.obj johnpaul.obj Metrowerks (Windows) mwld -library -o libjohnpaul.lib john.obj paul.obj johnpaul.obj Metrowerks (Mac OS X) mwld -library -o libjohnpaul.a john.o paul.o johnpaul.o Borland tlib libjohnpaul.lib /u /a /C +john +paul +johnpaul Digital Mars lib -c -n libjohnpaul.lib john.obj paul.obj johnpaul.obj
现在就可以把这些目标文件链接成一个静态库了:$ g++ -c -o john.o john.cpp $ g++ -c -o paul.o paul.cpp $ g++ -c -o johnpaul.o johnpaul.cpp
讨论$ ar ru libjohnpaul.a john.o paul.o johnpaul.o $ ranlib libjohnpaul.a
[ascii]工具集 命令行
GCC g++ -shared -fPIC -o libgeorgeringo.so george.o ringo.o georgeringo.o
GCC (Mac OS X) g++ -dynamiclib -fPIC -o libgeorgeringo.dylib george.o ringo.o georgeringo.o
GCC (Cygwin) g++ -shared -o libgeorgeringo.dll -Wl,out-implib,libgeorgeringo.dll.a-W1,export-all-symbols -Wl,enable-auto-image-base george.o ringo.o georgeringo.o
GCC (MinGW) g++ -shared -o libgeorgeringo.dll -Wl,out-implib,libgeorgeringo.a -W1,export-all-symbols-Wl,enable-auto-image-base george.o ringo.o georgeringo.o
Visual C++ link -nologo -dll -out:libgeorgeringo.dll -implib:libgeorgeringo.lib george.obj ringo.obj georgeringo.obj
Intel (Windows) xilink -nologo -dll -out:libgeorgeringo.dll -implib:libgeorgeringo.lib george.obj ringo.obj georgeringo.obj
Intel (Linux) g++ -shared -fPIC -lrt -o libgeorgeringo.so george.o ringo.o georgeringo.o georgeringo.obj
Metrowerks (Windows) mwld -shared -export dllexport -runtime dm -o libgeorgeringo.dll -implib libgeorgeringo.lib george.obj ringo.obj georgeringo.obj
Metrowerks (Mac OS X) mwld -shared -export pragma -o libgeorgeringo.dylib george.o ringo.o georgeringo.o
CodeWarrior 10.0 (Mac OS X)[4] (请查阅有关文档)Consult the Metrowerks documentation.
Borland bcc32 -q -WD -WR -elibgeorgeringo.dll george.obj ringo.obj georgeringo.objimplib -c libgeorgeringo.lib libgeorgeringo.dll
Digital Mars dmc -WD -L/implib:libgeorgeringo.lib -o libgeorgeringo.dll george.obj ringo.obj georgeringo.obj user32.lib kernel32.lib[/ascii]
这里,编译器选项-WR用于指定动态运行库。这三个命令将输出目标文件george.obj、ringo.obj和georgeringo.obj。接下来,输入命令:> bcc32 -c -q -WR -o george.obj george.cpp george.cpp: > bcc32 -c -q -WR -o ringo.obj ringo.cpp ringo.cpp: > bcc32 -c -q -WR -DGERORGERINGO_DLL -o georgeringo.obj georgeringo.cpp georgeringo.cpp:
这将生成动态库 libgeorgeringo.dll。最后,输入命令:> bcc32 -q -WD -WR -elibgeorgeringo.dll george.obj ringo.obj georgeringo.obj
将生成输入库libgeorgeringo.lib。> implib -c libgeorgeringo.lib libgeorgeringo.dll
从DLL中输出符号[ascii]LIBRARY LIBGEORGERINGO.DLL
EXPORTS
Georgeringo @1[/ascii]
正浏览此版面之用户: 没有注册用户 和 4 访客