如何将编译器优化标志添加到项目中的特定文件?

How to add compiler optimization flag to a specific file in a project?

我正在开发一个 C 项目,我使用 MATLAB Coder 从 MATLAB 转换而来。我做了很多更改来优化 C 代码,因为它在 t运行slation 之后非常慢。 为了进一步提高程序的执行速度,我尝试在CMakeLists中添加编译器优化标志,这大大减少了执行时间,但同时使程序崩溃最有可能发生,如这里所述。为了确定发生了什么,我 运行 我在我的项目中使用的 Clion 中的优化代码,发现很多变量的值发生了变化,因此程序的逻辑受到了影响。

我知道我的函数“ZCNET_detec_pkt.c”是花费最多时间的函数,因为它包含我项目的主要算法,我正在尝试优化它。目前打算一次优化一个源文件,方便调试。

我浏览了一些博客来学习“如何在 Cmake 中优化单个源文件”,但没有任何效果。 我尝试使用此博客中提到的 #pragma optimize 但这没有用。 我尝试使用 set_source_files_properties 添加优化标志,但这没有用。可能我做错了,但我没有使用 Cmake 的经验,所以我还在学习。

我正在使用的 CMakeLists.txt 是由 Clion 生成的,此时看起来像这样。

cmake_minimum_required(VERSION 3.10)
project(zc_dec C)

set(CMAKE_C_STANDARD 11)

add_executable(zc_dec
        abs.c
        abs.h
        bin2dec.c
        bin2dec.h
        circshift.c
        circshift.h
        .
        .
        .
        . )

set_source_files_properties(ZCNET_detec_pkt.c CMAKE_C_FLAGS "-O3")
target_sources(zc_dec PRIVATE
        ZCNET_detec_pkt.c
        ZCNET_detec_pkt.h)

target_link_libraries(zc_dec m -lfftw3 -lm)

我正在尝试弄清楚如何一次为一个特定的源文件添加编译器优化标志。任何帮助表示赞赏。 谢谢

I know that my function "ZCNET_detec_pkt.c" is the one that takes the most amount of time because it contains the main algorithm of my project and I am trying to optimize it. At this moment, I plan to optimize one source file at a time so that it will be easy to debug.

强烈鼓励您只使用RelWithDebInfo配置设置。

在单个文件上设置优化标志(尤其是 -O3)不一定会使您的程序像您预期的那样可调试,并且通常是一种反模式。在某些平台上,混合“调试”和“发布”对象是困难的或不可能的(Windows 就是这样的平台之一)。


然而,为了直接回答您的问题,这里有一个最小的例子:

cmake_minimum_required(VERSION 3.21)
project(inadvisable)

add_executable(inadvisable main.cpp src1.cpp)
set_source_files_properties(
  src1.cpp
  PROPERTIES
    COMPILE_OPTIONS "-O3"
)

然后我可以像这样编译和检查命令行:

$ touch main.cpp src1.cpp
$ cmake -G Ninja -S . -B build 
...
$ cmake --build build -- -nv
[1/3] /usr/bin/c++   -g -MD -MT CMakeFiles/inadvisable.dir/main.cpp.o -MF CMakeFiles/inadvisable.dir/main.cpp.o.d -o CMakeFiles/inadvisable.dir/main.cpp.o -c /path/to/main.cpp
[2/3] /usr/bin/c++   -g -O3 -MD -MT CMakeFiles/inadvisable.dir/src1.cpp.o -MF CMakeFiles/inadvisable.dir/src1.cpp.o.d -o CMakeFiles/inadvisable.dir/src1.cpp.o -c /path/to/src1.cpp
[3/3] : && /usr/bin/c++ -g  CMakeFiles/inadvisable.dir/main.cpp.o CMakeFiles/inadvisable.dir/src1.cpp.o -o inadvisable   && :

如您所见,-O3 仅应用于 src1.cpp 而未应用于 main.cpp