简介

  • 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-variableg++ 编译器的一个警告选项。使用该选项可以禁止编译器对未使用的变量发出警告信息。

为什么会有未使用变量的警告?

在编程中,有时候可能会定义一些变量,但在后续的代码中没有使用到这些变量。这种情况通常是代码的遗留部分或者在开发过程中进行了修改,但没有及时清理未使用的变量。这样的未使用变量可能会浪费内存,增加二进制文件的大小,并且可能意味着存在潜在的逻辑错误或不完整的代码。

编译器在进行代码编译时,可以检测到这样的未使用变量,并发出警告,提醒开发者可能存在问题。

-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-resultg++ 编译器的一个警告选项。使用该选项可以禁止编译器对未使用函数调用结果的警告信息。

为什么会有未使用函数调用结果的警告?

在编程中,有时候可能会调用一个函数,但没有对函数的返回值进行使用。这种情况通常是由于代码中的疏忽或者忘记处理函数的返回值。未使用函数调用结果可能会导致逻辑错误,丢失重要的返回值信息,或者引起其他问题。

编译器在进行代码编译时,可以检测到这样的未使用函数调用结果,并发出警告,提醒开发者可能存在问题。

-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-declarationsg++ 编译器的一个警告选项。使用该选项可以禁止编译器对已被标记为已废弃(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-psabig++ 编译器的一个警告选项。使用该选项可以禁止编译器对 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 不匹配的情况发出警告,尽管可能存在潜在的兼容性问题。

-Wno-format

-I

-D

-g

-funroll-loops

-march=core-avx-i

-fopenmp

-c

-o