简介
- rk_sdk 编译笔记
Unix/Linux 编译sdk
- 先配置build/linux/arm/目录下arm.linux.cross.cmake文件里的工具链,在运行make-Makefiles.bash脚本通过cmake生成Makefile,最后运行make -j16进行编译
vca 编译参数
1
2
/usr/bin/g++ -std=c++11 -fPIC -Wno-unused-variable -Wno-unused-result -Wno-deprecated-declarations -Wno-psabi -Wno-format -DVERSION_MAJOR=6 -DVERSION_MINOR=1 -DVERSION_RELEASE=6 -DSOLUTION_NAME=\"VideoProcess\" -I/mnt/remote/190-mnt/zhangjunyi/workspace/vca_dir/master/video_process/build//abcdk/include/ -DBOOST_BIND_GLOBAL_PLACEHOLDERS -I/mnt/remote/190-mnt/zhangjunyi/workspace/vca_dir/master/video_process/3party/GENERAL-x86_64/stb/ -DEIGEN_DONT_ALIGN_STATICALLY -I/mnt/remote/190-mnt/zhangjunyi/workspace/vca_dir/master/video_process/3party/GENERAL-x86_64/include/eigen3/ -DHAVE_KAFKA -DHAVE_REDIS -DHAVE_OPENCV -I/mnt/remote/190-mnt/zhangjunyi/workspace/vca_dir/master/video_process/3party/GENERAL-x86_64/include/opencv4 -DHAVE_FFMPEG -I/mnt/remote/190-mnt/zhangjunyi/workspace/vca_dir/master/video_process/3party/GENERAL-x86_64/include/ -I/usr/local/TensorRT//include/ -I/usr/local/cuda//include/ -DHAVE_OPENMP -fopenmp -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DENABLE_NVIDIA -g -funroll-loops -march=core-avx-i -I/mnt/remote/190-mnt/zhangjunyi/workspace/vca_dir/master/video_process/ -I/mnt/remote/190-mnt/zhangjunyi/workspace/vca_dir/master/video_process/lib/ -I/mnt/remote/190-mnt/zhangjunyi/workspace/vca_dir/master/video_process/mnc/lib/ -c mnc/lib/mnc_base.cc -o /mnt/remote/190-mnt/zhangjunyi/workspace/vca_dir/master/video_process/build//tmp/mnc/lib/mnc_base.o
mkdir -p /mnt/remote/190-mnt/zhangjunyi/workspace/vca_dir/master/video_process/build//tmp/mnc/
-std=c++11
-fPIC
在 C++ 编译器中,-fPIC
是一个编译选项,用于生成位置独立代码(Position Independent Code,PIC)。位置独立代码是一种机器代码,可以在内存中的任何位置加载并执行,而不需要进行修正或重新定位。这对于共享库(动态链接库)的创建非常重要,因为共享库可以在多个进程之间共享,且不会导致地址冲突。
下面是 -fPIC
编译选项的详解:
生成位置独立代码的目的:
在编译动态链接库时,为了让库的函数和变量能够在内存中任意位置加载,不同进程都可以使用同一个库映像,需要生成位置独立代码。这样,当多个进程加载共享库时,它们可以在各自的地址空间中将库映射到不同的虚拟内存地址,而不会发生地址冲突。
使用方法:
在使用 g++
编译器时,可以通过在命令行中添加 -fPIC
参数来启用位置独立代码的生成。例如:
1
g++ -fPIC -o my_shared_library.so my_source_code.cpp
上述命令将源代码 my_source_code.cpp
编译为位置独立的目标文件,并生成名为 my_shared_library.so
的共享库。
适用场景:
-fPIC
编译选项主要用于编译动态链接库,也就是共享库(Shared Library)。当我们希望创建一个能够在多个进程之间共享的共享库时,就应该使用 -fPIC
来生成位置独立代码。
相比之下,对于静态链接库(Static Library),由于其会被整体地复制到每个可执行文件中,不需要位置独立代码。
总结:-fPIC
编译选项用于生成位置独立代码,适用于编译动态链接库,确保库的函数和变量可以在内存中的任何位置加载和执行,以实现在多个进程之间共享共享库的目的。
-Wno-unused-variable
g++
是 GNU 编译器集合中的 C++ 编译器,而选项 -Wno-unused-variable
是 g++
编译器的一个警告选项。使用该选项可以禁止编译器对未使用的变量发出警告信息。
为什么会有未使用变量的警告?
在编程中,有时候可能会定义一些变量,但在后续的代码中没有使用到这些变量。这种情况通常是代码的遗留部分或者在开发过程中进行了修改,但没有及时清理未使用的变量。这样的未使用变量可能会浪费内存,增加二进制文件的大小,并且可能意味着存在潜在的逻辑错误或不完整的代码。
编译器在进行代码编译时,可以检测到这样的未使用变量,并发出警告,提醒开发者可能存在问题。
-Wno-unused-variable 编译选项的作用:
使用 -Wno-unused-variable
编译选项,会告诉编译器不对未使用的变量发出警告信息,即禁止这类警告。这在某些情况下可能是有用的,例如当我们明确知道某些变量当前未使用,但希望保留这些变量作为将来可能使用的部分代码。
示例:
假设我们有一个名为 example.cpp
的 C++ 源文件:
1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main() {
int a = 42; // 定义变量 a,但未使用
int b = 24; // 定义变量 b,并在后续代码中使用
std::cout << "b = " << b << std::endl; // 使用变量 b
return 0;
}
如果我们使用以下命令编译这个源文件:
1
g++ -Wall -Werror -Wno-unused-variable -o example example.cpp
在上面的命令中,-Wall
表示打开所有警告信息,-Werror
表示将警告视为错误,而 -Wno-unused-variable
则表示禁止对未使用变量发出警告。
在这种情况下,由于使用了 -Wno-unused-variable
选项,编译器不会对变量 a
未使用发出警告,而只会对变量 b
使用前未初始化发出警告(因为在 std::cout
之前使用了 b
)。
-Wno-unused-result
g++
是 GNU 编译器集合中的 C++ 编译器,而选项 -Wno-unused-result
是 g++
编译器的一个警告选项。使用该选项可以禁止编译器对未使用函数调用结果的警告信息。
为什么会有未使用函数调用结果的警告?
在编程中,有时候可能会调用一个函数,但没有对函数的返回值进行使用。这种情况通常是由于代码中的疏忽或者忘记处理函数的返回值。未使用函数调用结果可能会导致逻辑错误,丢失重要的返回值信息,或者引起其他问题。
编译器在进行代码编译时,可以检测到这样的未使用函数调用结果,并发出警告,提醒开发者可能存在问题。
-Wno-unused-result 编译选项的作用:
使用 -Wno-unused-result
编译选项,会告诉编译器不对未使用函数调用结果发出警告信息,即禁止这类警告。这在某些情况下可能是有用的,例如当我们明确知道某些函数的返回值当前未使用,但希望保留这些调用作为将来可能使用的部分代码。
示例:
假设我们有一个名为 example.cpp
的 C++ 源文件:
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
int doSomething() {
std::cout << "Doing something..." << std::endl;
return 42;
}
int main() {
doSomething(); // 调用函数,但未使用返回值
return 0;
}
如果我们使用以下命令编译这个源文件:
1
g++ -Wall -Werror -Wno-unused-result -o example example.cpp
在上面的命令中,-Wall
表示打开所有警告信息,-Werror
表示将警告视为错误,而 -Wno-unused-result
则表示禁止对未使用函数调用结果发出警告。
在这种情况下,由于使用了 -Wno-unused-result
选项,编译器不会对 doSomething()
函数调用的返回值未使用发出警告。
-Wno-deprecated-declarations
g++
是 GNU 编译器集合中的 C++ 编译器,而选项 -Wno-deprecated-declarations
是 g++
编译器的一个警告选项。使用该选项可以禁止编译器对已被标记为已废弃(deprecated)的声明发出警告信息。
什么是已废弃的声明?
在编程中,随着语言和库的发展,有些函数、类、变量等可能因为某些原因被废弃,意味着它们不再推荐使用,并可能会在将来的版本中被移除或替换。通常,废弃的声明是因为新的更好的替代品出现,或者由于安全或性能等问题。
编译器在进行代码编译时,如果发现代码中使用了已废弃的声明,会发出警告,提醒开发者尽早修改代码以避免潜在的问题。
-Wno-deprecated-declarations 编译选项的作用:
使用 -Wno-deprecated-declarations
编译选项,会告诉编译器不对已废弃的声明发出警告信息,即禁止这类警告。这在某些情况下可能是有用的,例如当我们明确知道代码中使用了已废弃的声明,但暂时无法修改代码,或者因为特定的需求需要保留这些废弃的声明。
示例:
假设我们有一个名为 example.cpp
的 C++ 源文件:
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
[[deprecated("Use newFunction() instead")]]
void oldFunction() {
std::cout << "This is an old function." << std::endl;
}
int main() {
oldFunction(); // 调用已废弃的函数
return 0;
}
如果我们使用以下命令编译这个源文件:
1
g++ -Wall -Werror -Wno-deprecated-declarations -o example example.cpp
在上面的命令中,-Wall
表示打开所有警告信息,-Werror
表示将警告视为错误,而 -Wno-deprecated-declarations
则表示禁止对已废弃的声明发出警告。
在这种情况下,由于使用了 -Wno-deprecated-declarations
选项,编译器不会对 oldFunction()
函数的调用发出警告,尽管它被标记为已废弃。
-Wno-psabi
g++
是 GNU 编译器集合中的 C++ 编译器,而选项 -Wno-psabi
是 g++
编译器的一个警告选项。使用该选项可以禁止编译器对 ABI(Application Binary Interface,应用程序二进制接口)不匹配的警告信息。
什么是 ABI?
ABI 是一种二进制接口,定义了应用程序和操作系统、编译器以及其他系统组件之间的交互规则。ABI 定义了如何在二进制级别表示数据类型、函数调用约定、异常处理、动态链接等细节。它确保了不同的软件模块之间能够正确地交互和协同工作。
-Wno-psabi 编译选项的作用:
使用 -Wno-psabi
编译选项,会告诉编译器不对 ABI 不匹配的情况发出警告信息,即禁止这类警告。
在某些情况下,当代码与其他组件或库编译时,可能会遇到 ABI 不匹配的情况,这可能导致链接错误或其他运行时问题。使用 -Wno-psabi
选项可以暂时忽略这类警告,但请注意,禁用这类警告可能会导致潜在的兼容性问题,因此最好在确保代码正确性的前提下使用该选项。
示例:
以下是一个简单的示例,展示如何使用 g++
编译器和 -Wno-psabi
选项:
假设我们有一个名为 example.cpp
的 C++ 源文件:
1
2
3
4
5
6
7
8
#include <iostream>
int main() {
int a = 42;
std::cout << "The value of a is: " << a << std::endl;
return 0;
}
如果我们使用以下命令编译这个源文件:
1
g++ -Wno-psabi -o example example.cpp
在上面的命令中,-Wno-psabi
表示禁止对 ABI 不匹配的警告。
在这种情况下,编译器不会对 ABI 不匹配的情况发出警告,尽管可能存在潜在的兼容性问题。