c++,so依赖静态库 编译后只有十几kb
时间: 2024-01-27 14:01:51 浏览: 34
c语言的编译器gcc在编译程序时和静态库链接时,只会将程序中实际用到的函数和变量复制到最终的可执行文件中,而对于没有被使用的函数和变量则不会被复制。因此,当程序依赖的静态库中只包含程序实际需要的函数和变量时,编译后的可执行文件会非常小,甚至只有几十kb的大小。
对于c语言来说,静态库是一种包含多个目标文件(.o文件)的库文件,其中包含了一系列相关的函数和变量。在编译程序时,可以使用静态库来避免代码的重复编写,提高代码的复用性和可维护性。
当程序使用静态库编译时,编译器会将程序中调用的函数和变量的引用替换为静态库中对应的实现,最终生成一个独立的可执行文件。由于静态库中只包含程序实际需要的函数和变量,因此最终的可执行文件大小会非常小。
总之,c语言依赖静态库编译后只有十几kb的大小是由于静态库中只包含程序实际需要的函数和变量,避免了代码的重复编写,提高了程序的可重用性和可维护性,同时也减小了最终可执行文件的体积。
相关问题
C++如何编译成静态库调用
编译一个 C++ 静态库需要以下步骤:
1. 编写 C++ 代码并将其保存在 .cpp 文件中。
2. 编写头文件并将其保存在 .h 文件中。
3. 将所有的 .cpp 文件编译成 .o 文件。可以使用以下命令:
```
g++ -c -o file.o file.cpp
```
这个命令将会把 `file.cpp` 编译成一个目标文件 `file.o`。
4. 将所有的 .o 文件打包成静态库。可以使用以下命令:
```
ar rcs libmylib.a file1.o file2.o ...
```
这个命令将会把所有的目标文件打包成一个静态库 `libmylib.a`。
5. 使用静态库的程序需要在编译的时候链接静态库。可以使用以下命令:
```
g++ -o myprog myprog.cpp -L. -lmylib
```
这个命令将会链接静态库 `libmylib.a` 到可执行文件 `myprog`。
其中,`-L.` 表示在当前目录中搜索静态库。`-lmylib` 表示链接名为 `libmylib.a` 的静态库。
交叉编译ios静态库怎么将c++11标准库静态链接进去
要将C++11标准库静态链接到iOS静态库中,你需要在编译时指定相应的编译选项。具体来说,你需要在编译命令中添加以下参数:
```
-std=c++11 -stdlib=libc++ -fvisibility=hidden -fvisibility-inlines-hidden -miphoneos-version-min=9.0 -isysroot /path/to/iphoneos.sdk -arch armv7 -arch arm64 -isystem /path/to/iphoneos.sdk/usr/include/c++/v1 -L/path/to/iphoneos.sdk/usr/lib/ -lc++abi -lc++ -lm
```
其中,`-std=c++11`参数指定使用C++11标准编译代码,`-stdlib=libc++`参数指定使用libc++标准库,`-fvisibility=hidden -fvisibility-inlines-hidden`参数指定隐藏符号,`-miphoneos-version-min=9.0`参数指定iOS最低版本为iOS 9.0,`-isysroot`参数指定iPhoneOS SDK的路径,`-arch`参数指定编译的架构,`-isystem`参数指定标准库头文件的路径,`-L`参数指定标准库的路径,`-lc++abi -lc++ -lm`参数指定链接的标准库。
如果你使用的是Xcode进行交叉编译,你可以在Build Settings中设置相应的编译选项。具体来说,你需要将以下编译选项添加到Other C++ Flags中:
```
-std=c++11 -stdlib=libc++ -fvisibility=hidden -fvisibility-inlines-hidden -miphoneos-version-min=9.0 -isysroot /path/to/iphoneos.sdk -arch armv7 -arch arm64 -isystem /path/to/iphoneos.sdk/usr/include/c++/v1
```
并将以下链接选项添加到Other Linker Flags中:
```
-L/path/to/iphoneos.sdk/usr/lib/ -lc++abi -lc++ -lm
```
通过这些设置,你可以将C++11标准库静态链接到iOS静态库中。