2017-01-02 12 views
0

Во-первых, я работаю над этим в течение нескольких дней, и я пробовал все возможные исправления (пошел на 10-ю страницу поиска Google, чтобы найти исправление), но я не могу получить это работать.CMake не правильно связывает файлы .obj LNK2019 __thiscall

Я переношу приложение Unix (G ++/Bison/Flex) в Windows (MSVC/WinBison/WinFlex). Я использую CMake как систему сборки, и идея состоит в том, чтобы построить проект из VS CMD и получить проект VS, готовый к модификации. Проект предназначен для работы на обеих платформах, поэтому все изменения должны быть сделаны в CMakeLists.txt, так что мне не нужно писать специальные инструкции, сделанные в VS.

Проблематичный линия в preprocessor.cc является

State current(task->CPFs);

а метод State(std::vector<ConditionalProbabilityFunction*> const& cpfs) объявлен в states.h с помощью следующего кода:

struct State { State(std::vector<ConditionalProbabilityFunction*> const& cpfs); State(State const& other) : state(other.state) {} State(int stateSize) : state(stateSize, 0.0) {}

и внедрены в states.cc:

State::State(vector<ConditionalProbabilityFunction*> const& cpfs) { for (unsigned int i = 0; i < cpfs.size(); ++i) { state.push_back(cpfs[i]->getInitialValue()); } }

states.h входит в states.cc и rddl.h (который включен в preprocessor.cc) и class States поступательно, объявленного в preprocessor.h (который включен в preprocessor.cc).

Ошибки я получаю являются

[ 36%] Linking CXX executable rddl-parser.exe preprocessor.cc.obj : error LNK2019: unresolved external symbol "public: __thiscall State::State(class std::vector<struct ConditionalProbabilityFunction *,class std::allocator<struct ConditionalProbabilityFunction *> > const &)" ([email protected]@[email protected][email protected]@@[email protected]@@@[email protected]@@[email protected]@@Z) referenced in function "private: void __thiscall Preprocessor::prepareActions(void)" ([email protected]@@AAEXXZ) rddl.cc.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall LogicalExpression::evaluate(double &,struct State const &,class ActionState const &)const " ([email protected]@@[email protected]@[email protected]@@Z)

Linking, когда сборка на Unix, работает отлично. Но когда я запускаю его в Windows, я получаю эту ошибку.

Это часть CMake кода, который делает связывание:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG") set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG") add_executable(rddl-parser ${RDDL_PARSER_SOURCES} ${FLEX_scanner_OUTPUTS} ${BISON_parser_OUTPUTS}) target_link_libraries(rddl-parser ${FLEX_LIBRARIES} ${BISON_LIBRARIES})

Возможность скопировать определение функции в исходный файл является не идти.

+0

отправьте сообщение [mcve] –

+0

@ m.s. Я попытался включить больше контекста. Проект действительно большой, и это лучшее, что я мог сделать, сохраняя его коротким и простым. –

+0

где находится 'State (std :: vector const & cpfs)' реализовано? вы должны действительно попытаться разбить свой проект, удалив как можно больше, чтобы устранить проблему. –

ответ

0

ОК, в этом проекте был почти дублированный код, где я отметил, что State был определен как struct, а не как класс. Когда я переключил его на определение класса со всеми общедоступными методами, компиляция прошла. Интересно, что это не проблема Unix и находится в Windows.

-1

Проверьте, соответствует ли объявление функции/класса точно их определениям. Может случиться так, что при компиляции logical_expressions.cc вы определяете то, что не идентично декларации forward для файлов preprocessor.cc и rddl.cc.

+0

код работает на Unix без каких-либо изменений в именах классов, так что это не проблема. –

+0

если вы уже проверили и исключили проблемы, связанные с определением/определением соответствия, это нормально. Тогда было бы возможно, что ваш блок перевода states.cc не будет включен во время ссылки. Не могли бы вы увеличить настройку вербности до CMAKE_VERBOSE_MAKEFILE, а затем reco nfigure и rebuild с помощью cmake? Отправьте журнал сборки по [gist] (https://gist.github.com/), спасибо. –

+0

Выполнено, вот журнал сборки https://gist.github.com/DjoleR/bc725600c7de6d3e7ef8a673583ee6f4 –