2015-08-11 2 views
0

У меня есть .cpp файл и соответствующий .h внутри проекта в CLion как так: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, который затем равен l подписанный в исполняемый файл, созданный главным проектом. Это .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 

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

ответ

0

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

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

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

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

В диалоговом окне настроек «Редактирование конфигураций» я установил «Сформировать все» в «Отпустить», «Хемилп» (исполняемый файл) до «Отпустить» и «Хефелп-ядро» (dylib) до «Отпустить», , Я все еще получаю ту же ошибку компоновщика. Когда я устанавливаю все 3 в «Debug», я не получаю ошибок. – rcplusplus

+0

Я бы еще дважды проверил версию стандартной библиотеки C++ для каждого из компонентов в настройках выпуска. Также проверьте все флаги оптимизации и т. Д. В большинстве случаев я видел эти странности, это были несоответствующие настройки между библиотекой и исполняемым соединением с этой библиотекой ... – rholmes

+0

Возможно, вам придется проверить свой файл CMake, чтобы убедиться, что ваши библиотеки и настройки сборки согласованы между различными компонентами как для релизов, так и для отладочных сборников. – rholmes