【问题标题】:Changes in header files (C++) are ignored?头文件 (C++) 中的更改会被忽略吗?
【发布时间】:2021-01-07 00:52:07
【问题描述】:

所以最近我在 C++ 中处理我的头文件并且出现了一些非常奇怪的东西。在我的头文件中,我定义了我的类,例如使用文件名数组加载声音样本的音频播放器:

#define NUM_WAVEFORMS 19

class AudioPlayer {
private:
    const char _waveFileNames[NUM_WAVEFORMS][40] = {"audio/startup_seq.wav", "audio/startup_warning.wav", 
                                        "audio/start_signal.wav", "audio/warning_person.wav",
                                        "audio/warning_bicycle.wav", "audio/warning_car.wav",
                                        "audio/warning_motorcycle.wav", "audio/warning_bus.wav",
                                        "audio/warning_trafficlight_red.wav", "audio/warning_trafficlight_green.wav",
                                        "audio/warning_sidewalk.wav", "audio/warning_uphill.wav",
                                        "audio/warning_downhill.wav", "audio/suggestion_bench.wav",
                                        "audio/suggestion_chair.wav", "audio/suggestion_bin.wav",
                                        "audio/to_day.wav", "audio/to_night.wav", "audio/to_park.wav"};
    Mix_Chunk* _sample[NUM_WAVEFORMS];
public:
...

现在我注意到的是,当我更改文件名数组、重命名元素或添加新元素时,编译时不会应用这些更改。当我在主 .cpp 文件中打印数组的元素时,我得到错误的索引和元素,因为数组处于先前的状态。当我将数组的长度更改为 1 并尝试合法访问最后一个元素时,它给了我一个分段错误,这意味着它假定它不存在。这里发生了什么?我感觉我的头文件编译不正确。

这是我的 CMakeLists.txt:(Yolo_with_Opencv 是我的主要 C++ 文件)

cmake_minimum_required (VERSION 3.5)
include(FindPkgConfig)

project (Yolo_with_Opencv)

set (CMAKE_CXX_STANDARD 11)
set (CMAKE_CXX_STANDARD_REQUIRED TRUE)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -std=c++11 -pthread")
set (source_dir "${PROJECT_SOURCE_DIR}/src/")
SET (OpenCV_DIR "/home/installation/OpenCV-3.3.1/opencv/include/opencv2")

file (GLOB source_files "${source_dir}/Yolo_with_Opencv.cpp")

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
find_package(SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS})
pkg_check_modules(SDL2_Mixer REQUIRED IMPORTED_TARGET SDL2_mixer)
find_package(ALSA REQUIRED)
include_directories(${ALSA_INCLUDE_DIRS})

add_executable (Yolo_with_Opencv ${source_files})
target_include_directories(Yolo_with_Opencv PRIVATE ${source_dir})
target_link_libraries(Yolo_with_Opencv ${OpenCV_LIBS})
target_link_libraries(Yolo_with_Opencv ${SDL2_LIBRARIES})
target_link_libraries(Yolo_with_Opencv PkgConfig::SDL2_Mixer)
target_link_libraries(Yolo_with_Opencv ${ALSA_LIBRARIES})
target_link_libraries(Yolo_with_Opencv i2c)

谢谢!

【问题讨论】:

  • 如果没有您的设置,我们无法判断问题所在。可能是您没有发布一个干净的构建,您编辑了错误的文件,或者您的程序存在一直存在的错误,但现在您看到了这些错误的表现。
  • 有什么证据表明当您更改头文件时,包含该头文件的每个 cpp 都会重新编译并重新链接?
  • @PaulMcKenzie 我可以肯定地说我没有编辑错误的文件,也不是因为错误。 “发布干净的构建”是什么意思?
  • @Sam Varshavchik 我不能,这就是我问这个问题的原因。我该怎么做?
  • 好吧,你需要自己解决这个问题。当您更改头文件时,除了您之外没有人可以记录哪些文件被编译。

标签: c++ cmake compilation header include


【解决方案1】:

我认为,cmake 不监视文件更改的原因是该文件没有作为依赖项添加到目标中。您将 source_fles 定义为单个 cpp 文件。将头文件添加到 source_file 变量中,文件中的任何更改都将触发重新编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2018-06-25
    相关资源
    最近更新 更多