CMake包含错误(找不到文件,未定义引用)

时间:2017-10-23 12:26:24

标签: c++ cmake

我有一个include文件夹和一个src文件夹,我得到一个未定义的引用错误。我的项目以前工作过,所以我不知道发生了什么。

错误

$ cmake --build .
-- Configuring done
-- Generating done
-- Build files have been written to: /sdcard/dev/cpp/Bedrock++
Scanning dependencies of target Bedrock++
[ 33%] Building CXX object src/CMakeFiles/Bedrock++.dir/Server.cpp.o
[ 66%] Building CXX object src/CMakeFiles/Bedrock++.dir/main.cpp.o
[100%] Linking CXX executable Bedrock++
CMakeFiles/Bedrock++.dir/main.cpp.o: In function `main':
/sdcard/dev/cpp/Bedrock++/src/main.cpp:(.text+0x70): undefined 
reference to `ChatFormat::Blue'
clang-5.0: error: linker command failed with exit code 1 (use -v to see 
invocation)
make[2]: *** [src/CMakeFiles/Bedrock++.dir/build.make:121: 
src/Bedrock++] Error 1
make[1]: *** [CMakeFiles/Makefile2:86: 
src/CMakeFiles/Bedrock++.dir/all] Error 2
make: *** [Makefile:130: all] Error 2

Project root CMakeLists.txt

cmake_minimum_required(VERSION 2.8.7)

# Build all dependent libraries as static

project(Bedrock++)

#add_subdirectory(lib/json)

add_subdirectory(src)
add_subdirectory(include)

src CMakeLists.txt

project(bedrock++)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

include_directories("${PROJECT_SOURCE_DIR}/include")

file(GLOB SOURCES "*.cpp")

add_executable(${PROJECT_NAME} ${SOURCES})

包括CMakeLists.txt

install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" FILES_MATCHING PATTERN "*.h")

的main.cpp

#include <iostream>
#include <string>
#include "util/ChatFormat.h"

int main()
{
    std::cout << "Hello World! " << ChatFormat::Blue << "hey" << std::endl;
}

ChatFormat.h标头位于include / util / ChatFormat.h中,基本上包含

static const std::string Black;

但是对于每种不同的颜色。 不确定它是否相关,但ChatFormat.cpp文件包含以下内容

const std::string ChatFormat::Delimiter = "\xc2\xa7";

const std::string ChatFormat::Black = ChatFormat::Delimiter + "0";

2 个答案:

答案 0 :(得分:1)

标头包含错误

找不到#34;头文件的问题&#34;是src/CMakeLists.txt包含project()命令。这为该子树宣布了一个新的CMake项目(想想Visual Studio 解决方案)。因此,PROJECT_SOURCE_DIR将引用该子树中该项目的源目录。换句话说,您的${PROJECT_SOURCE_DIR}/include会解析为${CMAKE_SOURCE_DIR}/src/include

根据您的CMake文件结构,我说src/CMakeLists.txt包含project()命令是没有意义的。只需删除它,包含路径应​​该开始为你工作。

未解决的参考错误

这个问题并没有包含足够的信息来解决这个问题,但我的预感是你在一个专门的源文件中弄乱了内部链接(static)和定义。这些通常不会啮合。您可能想要阅读Stack Overflow上的规范Undefined Reference question

答案 1 :(得分:0)

CMake输出表明&#39; ChatFormat.cpp&#39;,其中包含&#39; ChatFormat :: Black&#39;的定义,未编译。只有&#39; Server.cpp&#39;和&#39; main.cpp&#39;正在编制中。

我猜测&#39; ChatFormat.cpp&#39;就像它的相应标题一样,是在&#39; utils&#39;目录?但是,用于查找源文件的GLOB命令只会在根文件夹中查找文件名* .cpp。您可能想尝试更改“GLOB&#39;到&#39; GLOB_RECURSE&#39;因此它会在子文件夹中拾取文件,但通常建议您完全避免使用globbing并明确列出每个源文件...