【问题标题】:CMake undefined reference error on class dependencyCMake关于类依赖的未定义引用错误
【发布时间】:2016-06-22 19:30:33
【问题描述】:

所以我几天前下载了 CLion,但我仍然习惯使用 CMake。

我认为这里的问题有一个非常简单的解决方案,但我似乎无法弄清楚。

我目前正在使用 OpenAL 为我的一个项目编写一个正弦波声音发生器。我已经将 FindOpenAl.cmake 文件包含到 cmake_modules 目录中,并确保我尽可能地设置了 CMakeLists.txt 文件。但是,当我尝试构建可执行文件时,我收到 OpenAL 函数 alGenBuffers 的未定义引用错误。

//SineWaveGenerator.h

#ifndef BLINDSOUND_SINEWAVEGENERATOR_H
#define BLINDSOUND_SINEWAVEGENERATOR_H

#include <AL/al.h>
#include <AL/alc.h>

class SineWaveGenerator
{
    ALCdevice * dev;
    ALCcontext * ctx;
    ALuint buffer;

    SineWaveGenerator(ALCdevice * _dev, ALCcontext * _ctx);
    ALuint generateSineWave(double freq, double seconds, unsigned int sampleRate);
};

#endif //BLINDSOUND_SINEWAVEGENERATOR_H

//SineWaveGenerator.cpp

#include "../../include/Sound/SineWaveGenerator.h"

SineWaveGenerator::SineWaveGenerator(ALCdevice *_dev, ALCcontext *_ctx)
{
    this->dev = _dev;
    this->ctx = _ctx;

    alGenBuffers(1, &this->buffer);
}

ALuint SineWaveGenerator::generateSineWave(double freq, double seconds, unsigned int sampleRate)
{
    int buffer_size = (int)(sampleRate*seconds);
    short samples [buffer_size];
}

//CMakeLists.txt

make_minimum_required(VERSION 3.4)
project(BlindSound)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES src/main.cpp include/Sound/SineWaveGenerator.h src/Sound/SineWaveGenerator.cpp)
add_executable(BlindSound ${SOURCE_FILES})

#LIBRARIES
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})

##SFML
find_package(SFML 2.3 REQUIRED system window graphics audio)
if(SFML_FOUND)
    include_directories(${SFML_INCLUDE_DIR})
    target_link_libraries(BlindSound ${SFML_LIBRARIES})
endif()

##OpenAL
find_package(OpenAL 1.0 REQUIRED)
if(OPENAL_FOUND)
    include_directories(${OPENAL_INCLUDE_DIR})
    target_link_libraries(BlindSound ${OPENAL_LIBRARIES})
endif()

我知道我显然做错了什么,但我不知道是什么。我最好的猜测是我应该将 OpenAL 库直接链接到 SineWaveGenerator.cpp,但我什至不知道这是否可能或是否应该这样做。

非常感谢。

编辑:我忘了添加错误报告。它在下面添加。

/home/chemicalchems/clion/bin/cmake/bin/cmake --build /home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Debug --target all -- -j 4
[ 33%] Linking CXX executable BlindSound
CMakeFiles/BlindSound.dir/src/Sound/SineWaveGenerator.cpp.o: In function `SineWaveGenerator::SineWaveGenerator(ALCdevice_struct*, ALCcontext_struct*)':
/home/chemicalchems/ClionProjects/BlindSound/src/Sound/SineWaveGenerator.cpp:12: undefined reference to `alGenBuffers'
collect2: error: ld returned 1 exit status
CMakeFiles/BlindSound.dir/build.make:124: recipe for target 'BlindSound' failed
make[2]: *** [BlindSound] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/BlindSound.dir/all' failed
make[1]: *** [CMakeFiles/BlindSound.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

EDIT 2:详细的错误报告

/home/chemicalchems/clion/bin/cmake/bin/cmake --build /home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release --target BlindSound -- -j 4
/home/chemicalchems/clion/bin/cmake/bin/cmake -H/home/chemicalchems/ClionProjects/BlindSound -B/home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/make -f CMakeFiles/Makefile2 BlindSound
make[1]: Entering directory '/home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release'
/home/chemicalchems/clion/bin/cmake/bin/cmake -H/home/chemicalchems/ClionProjects/BlindSound -B/home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release --check-build-system CMakeFiles/Makefile.cmake 0
/home/chemicalchems/clion/bin/cmake/bin/cmake -E cmake_progress_start /home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release/CMakeFiles 3
/usr/bin/make -f CMakeFiles/Makefile2 CMakeFiles/BlindSound.dir/all
make[2]: Entering directory '/home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release'
/usr/bin/make -f CMakeFiles/BlindSound.dir/build.make CMakeFiles/BlindSound.dir/depend
make[3]: Entering directory '/home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release'
cd /home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release && /home/chemicalchems/clion/bin/cmake/bin/cmake -E cmake_depends "Unix Makefiles" /home/chemicalchems/ClionProjects/BlindSound /home/chemicalchems/ClionProjects/BlindSound /home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release /home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release /home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release/CMakeFiles/BlindSound.dir/DependInfo.cmake --color=
make[3]: Leaving directory '/home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release'
/usr/bin/make -f CMakeFiles/BlindSound.dir/build.make CMakeFiles/BlindSound.dir/build
make[3]: Entering directory '/home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release'
[ 33%] Linking CXX executable BlindSound
/home/chemicalchems/clion/bin/cmake/bin/cmake -E cmake_link_script CMakeFiles/BlindSound.dir/link.txt --verbose=1
/usr/bin/c++    -std=c++11 -O3 -DNDEBUG   CMakeFiles/BlindSound.dir/src/main.cpp.o CMakeFiles/BlindSound.dir/src/Sound/SineWaveGenerator.cpp.o  -o BlindSound /usr/lib/x86_64-linux-gnu/libsfml-system.so /usr/lib/x86_64-linux-gnu/libsfml-window.so /usr/lib/x86_64-linux-gnu/libsfml-graphics.so /usr/lib/x86_64-linux-gnu/libsfml-audio.so 
CMakeFiles/BlindSound.dir/src/Sound/SineWaveGenerator.cpp.o: In function `SineWaveGenerator::SineWaveGenerator(ALCdevice_struct*, ALCcontext_struct*)':
SineWaveGenerator.cpp:(.text+0x11): undefined reference to `alGenBuffers'
collect2: error: ld returned 1 exit status
CMakeFiles/BlindSound.dir/build.make:127: recipe for target 'BlindSound' failed
make[3]: *** [BlindSound] Error 1
make[3]: Leaving directory '/home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release'
CMakeFiles/Makefile2:70: recipe for target 'CMakeFiles/BlindSound.dir/all' failed
make[2]: *** [CMakeFiles/BlindSound.dir/all] Error 2
make[2]: Leaving directory '/home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release'
CMakeFiles/Makefile2:82: recipe for target 'CMakeFiles/BlindSound.dir/rule' failed
make[1]: *** [CMakeFiles/BlindSound.dir/rule] Error 2
make[1]: Leaving directory '/home/chemicalchems/.CLion15/system/cmake/generated/BlindSound-175ed20c/175ed20c/Release'
Makefile:121: recipe for target 'BlindSound' failed
make: *** [BlindSound] Error 2

【问题讨论】:

  • 在我看来,您正在调试模式下进行编译。我想你的库也处于调试模式?
  • 我真的无法回答,因为我根本不知道。
  • 您能否打开运行配置(SHIFT+ALT+F10 或运行>编辑配置...)并将Configuration 组合从Debug 更改为Release 并再次测试?
  • set(CMAKE_VERBOSE_MAKEFILE ON) 添加到您的 CMakeLists.txt(紧跟在 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 之后)。并粘贴详细的错误报告
  • 发现错误。不存在名为 OPENAL_LIBRARIES 的变量,它是 OPENAL_LIBRARY。再次检查 CMakeLists.txt 并发现。非常感谢您的帮助。请继续发布答案,我会接受并投票。非常感谢您的帮助。

标签: c++ cmake undefined-reference openal


【解决方案1】:

好的,那么:

  1. set(CMAKE_VERBOSE_MAKEFILE ON) 添加到您的CMakeLists.txt(就在set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 之后)。并粘贴详细的错误报告。

  2. 尝试回答这些问题:您确定将Target All targetsRun ConfigurationSHIFT+ALT+F10Run&gt;Edit configurations)更改为Release 模式吗?您确定详细错误中列出的每个库都存在并且是您需要的所有库吗?你的库是用 C 或 C++ 编译器编译的吗?

正如你在 cmets 中所说,问题在于:

不存在名为 OPENAL_LIBRARIES 的变量,它是 OPENAL_LIBRARY

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2016-06-10
    • 2020-09-08
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多