【发布时间】: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