Как исправить ошибку g++ Неопределенные символы для архитектуры x86_64?

Прежде всего, я прочитал соответствующий контент на Stackoverflow по этой проблеме, но до сих пор не могу ее решить. Я максимально упростил свой код.

У меня есть только собственный класс с файлами .h и .cpp, но я получаю сообщение об ошибке при попытке создать экземпляр этого класса из main.cpp.

main.cpp

#include "Customer.h"
using namespace std;

int main() {
    Customer a("string");

    return 0;
}

Клиент.h

using namespace std;

class Customer {
public:
    Customer(string input);
};

Customer.cpp

#include "Customer.h"
using namespace std;

Customer::Customer(string input) {
}

Сообщение об ошибке, которое я получаю, следующее?

  gcc *.cpp -o k


  Undefined symbols for architecture x86_64:
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long)", referenced from:
        _main in main-40340f.o
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
        _main in main-40340f.o
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from:
        _main in main-40340f.o
    "std::terminate()", referenced from:
        ___clang_call_terminate in main-40340f.o
    "___cxa_begin_catch", referenced from:
        ___clang_call_terminate in main-40340f.o
    "___gxx_personality_v0", referenced from:
        _main in main-40340f.o
        Dwarf Exception Unwind Info (__eh_frame) in main-40340f.o
  ld: symbol(s) not found for architecture x86_64
  clang: error: linker command failed with exit code 1 (use -v to see invocation)

clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я запускаю Mac OS X 10.9 и Sublime Text 3. gcc -v дает следующее:

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix

Он компилируется без проблем, когда я пишу вместо них пустые конструкторы.

Что может вызвать эту проблему?


person Han Tuzun    schedule 06.05.2014    source источник


Ответы (5)


Две проблемы:

  1. Вы должны #include <string>.
  2. Чтобы скомпилировать код C++ в OS X, используйте clang++ или g++.
person Bill Lynch    schedule 06.05.2014

Используйте g++ вместо gcc:

$ g++ *.cpp -o k

а затем драйвер компилятора знает, что нужно подключить библиотеку времени выполнения C++. Учитывая, что на самом деле вы используете clang, а не gcc, тогда это лучше:

$ clang++ *.cpp -o k
person trojanfoe    schedule 06.05.2014
comment
Хотя в данном случае это не имеет значения, g++ и clang++ различны в OS X. g++ будет использовать libstdc++, а clang++ будет использовать libc++. Однако оба используют интерфейс LLVM. - person Bill Lynch; 06.05.2014
comment
@sharth Что ж, это интересно и повлияет, если будут использоваться сторонние библиотеки. - person trojanfoe; 06.05.2014

Используйте "g++" вместо "gcc" для компиляции и компоновки вашего приложения. Он автоматически знает о библиотеках C++, которые необходимо включить.

person Ernest Friedman-Hill    schedule 06.05.2014

Вам необходимо установить инструменты командной строки. https://developer.apple.com/downloads/

person mazei    schedule 27.04.2016

g++ main.cpp(или Customer.cpp) -o k недостаточно. Вы должны скомпилировать их одновременно. "g++ main.cpp Customer.cpp (и другие файлы *.cpp, если они у вас есть) -o target" будет работать хорошо.

person Antianxia Simida    schedule 20.05.2016