【问题标题】:Undefined symbols when actually including. Broken compiler/IDE?实际包含时未定义的符号。损坏的编译器/IDE?
【发布时间】:2015-04-14 14:26:24
【问题描述】:

我正在测试 CLion IDE,并且正在尝试编写一个最小的 C++ 程序。这是我的代码:

在 main.cpp 中:

#include "classings.h"

int main() {
    classings s;
    s.doSomething();
    return 0;
}

在classings.h中:

class classings {
public:
    void doSomething();
};

在classings.cpp中:

#include <string>
#include <iostream>
#include "classings.h"

void classings::doSomething() {
    std::cout << "hei" << std::endl;
}

我不知道为什么这会给我这个错误:

Undefined symbols for architecture x86_64:
  "classings::doSomething()", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我使用的是 OSX 10.10。

【问题讨论】:

  • 您的包含与它无关。 “未定义的符号”是一个链接器错误——你需要告诉链接器要链接哪些库。
  • 但是我不需要库来链接这个简单的程序。
  • @HenrikHillestadLøvold:同意,并没有真正检查您的代码。但是,仍然是 linker 抱怨。 classings::doSomething() 在 classings.cpp 中定义,链接器在 _main 中停止,在 main.cpp 中定义。您确定您的链接器可以看到两个翻译单元吗?你提到了 CMake。您的 CMakeLists.txt 中有 classings.cpp 吗?
  • 实际上,我通常不鼓励初学者使用 IDE。您与 IDE 的细节做太多的斗争,而没有充分了解事物的一般工作原理。 IDE 非常适合朝九晚五的工作,但要学习绳索,请一直使用命令行。在 IDE 将其自动化之前了解编译器/链接器/makefile 的工作原理。 (实际上,我从隧道的另一端走出来,今天使用 Vim 和手工制作的 CMake 设置更有效率。;-))

标签: c++ cmake clang clion


【解决方案1】:

我认为您的源文件classings.hclassings.cpp 不包含在您的CMakeLists.txt 中。

如果你打开CMakeLists.txt,它应该是这样的:

不完整CMakeLists.txt

cmake_minimum_required(VERSION 2.8.4)
project(untitled)

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

set(SOURCE_FILES main.cpp) # your other source files aren't listed
add_executable(my-program ${SOURCE_FILES})

您可以通过包含新的源文件来解决问题

正确CMakeLists.txt

cmake_minimum_required(VERSION 2.8.4)
project(untitled)

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

set(SOURCE_FILES main.cpp classings.hpp classings.cpp) # manually listing all sources
add_executable(my-program ${SOURCE_FILES})

仅供参考,每次使用file()aux_source_directory() 命令添加/删除新源文件时,您都可以省去编辑CMakeLists.txt 的麻烦。这是一个例子:

set(SOURCE_DIRECTORY "src")
file(GLOB_RECURSE SOURCE_FILES "${SOURCE_DIRECTORY}/*.c"   "${SOURCE_DIRECTORY}/*.h"
                               "${SOURCE_DIRECTORY}/*.cc"  "${SOURCE_DIRECTORY}/*.hh"
                               "${SOURCE_DIRECTORY}/*.cpp" "${SOURCE_DIRECTORY}/*.hpp"
                               "${SOURCE_DIRECTORY}/*.cxx" "${SOURCE_DIRECTORY}/*.hxx")
add_executable(my-program ${SOURCE_FILES})

或者

aux_source_directory("src" SOURCE_FILES)
add_executable(my-program ${SOURCE_FILES})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 2016-11-18
    • 2013-03-07
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多