CLion - Выпуск сборки, вызывающий ошибки компоновщика

У меня есть .cpp файл и соответствующий .h внутри проекта в CLion вот так:

element.h

#pragma once

#include <string>
#include <unordered_map>

enum class Element
{
    H, He,
    Li, Be, B, C, N, O, F, Ne,
    Na, Mg, Al, Si, P, S, Cl, Ar,
    K, Ca
};

class ElementHash
{
// simple hash function in operator()
};

// LINE IN QUESTION:
std::ostream& operator<<(std::ostream& out, const Element& e);

struct ElementData
{
};

extern const std::unordered_map<std::string, Element> elementObjectLookupTable;
extern const std::unordered_map<Element, ElementData, ElementHash> elementDataLoopkupTable;

std::string toString(const Element& e);

element.cpp

#include "element.h"

using namespace std;


ostream& operator<<(ostream& out, const Element& e)
{
    out << toString(e);
    return out;
}

// rest of the file's not important

Эти два файла (наряду с другими) все собраны из подкаталога в .dylib который затем связывается с исполняемым файлом, созданным основным проектом. это .dylib сборки и ссылки просто отлично работают под сборкой Debug, но когда я переключаюсь на выпуск сборки в IDE, я получаю следующую ошибку компоновщика:

Undefined symbols for architecture x86_64:
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Element const&) in element.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)
make[3]: *** [/Users/_____/ClionProjects/chemhelp/bin/Release/libchemhelp-core.dylib] Error 1
make[2]: *** [CMakeFiles/chemhelp-core.dir/all] Error 2
make[1]: *** [CMakeFiles/chemhelp-core.dir/rule] Error 2
make: *** [chemhelp-core] Error 2

Я не знаю, что-то не так в моем проекте или в настройках, но по какой-то причине сборка релиза не удалась.

1 ответ

Сообщение об ошибке выглядит так, как будто ваша библиотека была скомпилирована с другой архитектурой и / или настройками сборки, чем другой код в вашем проекте.

Конечно, попробуйте сначала очистить проект.

Вам может потребоваться настроить ваш проект так, чтобы:

  • В вашей отладочной сборке вы компилируете библиотеку и основную часть с одинаковыми настройками отладки и связываетесь с той же версией стандартной библиотеки C++.
  • Аналогично в выпуске библиотека и основной код должны использовать одинаковые флаги выпуска и ссылаться на одну и ту же версию стандартных библиотек C++.
Другие вопросы по тегам