GMock and Undefined References Error in Qt - c++

I'm trying google mock testing using Qt Creator in Windows, but it turns to have so many different undefined reference errors.
I tried it in Linux and it's working. I don't know if I have a wrong setup with gmock when it comes to Windows.
Here's the code with issues on MOCK_CONST_METHOD2, MOCK_METHOD2, MOCK_METHOD1, and on the first two EXPECT_CALL. And also have issues on gmock header files.
main.cpp
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "mail_service.hpp"
#include "warehouse.hpp"
#include "order.hpp"
using ::testing::Return;
using ::testing::_; // Matcher for parameters
/** \brief Mock for the warehouse interface.
* \author David Stutz
*/
class MockWarehouse : public Warehouse
{
public:
// see https://github.com/google/googletest/blob/master/googlemock/docs/ForDummies.md
MOCK_CONST_METHOD2(hasInventory, bool(int, std::string));
MOCK_METHOD2(remove, void(int, std::string));
};
/** \brief Mock for the mail service interface.
* \author David Stutz
*/
class MockMailService : public MailService
{
public:
MockMailService()
{
}
MOCK_METHOD1(send, void(std::string));
};
TEST(OrderTest, Fill)
{
MockWarehouse warehouse;
std::shared_ptr<MockMailService> mailService = std::make_shared<MockMailService>();
Order order(50, "Talisker");
order.setMailService(mailService);
EXPECT_CALL(warehouse, hasInventory(50, "Talisker"))
.Times(1)
.WillOnce(Return(true));
EXPECT_CALL(warehouse, remove(50, "Talisker"))
.Times(1);
EXPECT_CALL(*mailService, send(_)) // Not making assumptions on the message send ...
.Times(1);
ASSERT_TRUE(order.fill(warehouse));
}
/** \brief Main test entrance point.
* \param[in] argc
* \param[in] argv
*/
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
headers
mail_service.hpp
#ifndef MAIL_SERVICE_HPP
#define MAIL_SERVICE_HPP
class MailService
{
public:
/** \brief Send a mial.
* \param[in] message message to send
*/
virtual void send(std::string message) = 0;
};
#endif /* MAIL_SERVICE_HPP */
order.hpp
#ifndef ORDER_HPP
#define ORDER_HPP
#include <string>
#include <memory>
#include "warehouse.hpp"
#include "mail_service.hpp"
/** \brief An order of a product with quantity. */
class Order
{
public:
/** \brief Constructor.
* \param[in] quantity quantity requested
* \param[in] product product name requested
*/
Order(int quantity, std::string product)
{
this->quantity = quantity;
this->product = product;
}
/** \brief Set the mail service to use.
* \param[in] mailService the mail service to attach
*/
void setMailService(std::shared_ptr<MailService> mailService)
{
this->mailService = mailService;
}
/** \brief Fill the order given the warehouse.
* \param[in] warehouse the warehouse to use
* \return whether the operation was successful
*/
bool fill(Warehouse &warehouse)
{
if (warehouse.hasInventory(quantity, product))
{
// ...
warehouse.remove(quantity, product);
this->mailService->send("Order filled.");
return true;
}
else
{
// ...
this->mailService->send("Order not filled.");
return false;
}
}
private:
/** \brief Product name. */
std::string product;
/** \brief Quantity requested. */
int quantity;
/** \brief Mail service to use. */
std::shared_ptr<MailService> mailService;
};
#endif /* ORDER_HPP */
warehouse.hpp
#ifndef WAREHOUSE_HPP
#define WAREHOUSE_HPP
#include <string>
/** \brief Warehouse interface. This interface is one of the collaborators of our SUT.
class Warehouse
{
public:
/** \brief Check whether the product in the given quantity is on stock.
* \param[in] quantity quantity requested
* \param[in] product product name
* \return whether the warehouse has the product on stock for the given quantity
*/
virtual bool hasInventory(int quantity, std::string product) const = 0;
/** \brief Remove the given quantity of the product from the warehouse.
* \param[in] quantity quantity to remove
* \param[in] product product name to remove
*/
virtual void remove(int quantity, std::string product) = 0;
};
#endif /* WAREHOUSE_HPP */
Here's the makefile
Here's the .pro file
CONFIG += console c++14
INCLUDEPATH += "google/gmock/include/"
INCLUDEPATH += "google/gmock/"
INCLUDEPATH += "google/gtest/include/"
INCLUDEPATH += "google/gtest/src/"
INCLUDEPATH += "google/gtest/"
INCLUDEPATH += "google/"
INCLUDEPATH += "../../"
SOURCES += \
order.cpp \
google/gtest/src/gtest.cc \
google/gtest/src/gtest-all.cc \
google/gtest/src/gtest-death-test.cc \
google/gtest/src/gtest-filepath.cc \
google/gtest/src/gtest-port.cc \
google/gtest/src/gtest-printers.cc \
google/gtest/src/gtest-test-part.cc \
google/gtest/src/gtest-typed-test.cc
HEADERS += \
mail_service.hpp \
order.hpp \
warehouse.hpp
And here's the compile output errors:
10:53:25: Running steps for project GoogleMockTest2...
10:53:25: Configuration unchanged, skipping qmake step.
10:53:27: Starting: "C:\Qt\Qt5.9.3\Tools\mingw530_32\bin\mingw32-make.exe"
C:\Qt\Qt5.9.3\5.9.3\mingw53_32\bin\qmake.exe -o Makefile ..\GoogleMockTest2\GoogleMockTest2.pro -spec win32-g++ "CONFIG+=debug" "CONFIG+=qml_debug"
C:/Qt/Qt5.9.3/Tools/mingw530_32/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'C:/Users/PB9N0052/Documents/build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug'
g++ -c -fno-keep-inline-dllexport -g -std=gnu++1y -Wextra -Wall -W -fexceptions -mthreads -DUNICODE -D_UNICODE -DQT_QML_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I..\GoogleMockTest2 -I. -I..\GoogleMockTest2\google\googlemock\include -I..\GoogleMockTest2\google\googlemock -I..\GoogleMockTest2\google\googletest\include -I..\GoogleMockTest2\google\googletest\src -I..\GoogleMockTest2\google\googletest -I..\GoogleMockTest2\google -I..\..\..\PB9N0052 -I..\..\..\..\Qt\Qt5.9.3\5.9.3\mingw53_32\include -I..\..\..\..\Qt\Qt5.9.3\5.9.3\mingw53_32\include\QtGui -I..\..\..\..\Qt\Qt5.9.3\5.9.3\mingw53_32\include\QtANGLE -I..\..\..\..\Qt\Qt5.9.3\5.9.3\mingw53_32\include\QtCore -Idebug -I..\..\..\..\Qt\Qt5.9.3\5.9.3\mingw53_32\mkspecs\win32-g++ -o debug\warehouse.o ..\GoogleMockTest2\warehouse.cpp
g++ -c -fno-keep-inline-dllexport -g -std=gnu++1y -Wextra -Wall -W -fexceptions -mthreads -DUNICODE -D_UNICODE -DQT_QML_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I..\GoogleMockTest2 -I. -I..\GoogleMockTest2\google\googlemock\include -I..\GoogleMockTest2\google\googlemock -I..\GoogleMockTest2\google\googletest\include -I..\GoogleMockTest2\google\googletest\src -I..\GoogleMockTest2\google\googletest -I..\GoogleMockTest2\google -I..\..\..\PB9N0052 -I..\..\..\..\Qt\Qt5.9.3\5.9.3\mingw53_32\include -I..\..\..\..\Qt\Qt5.9.3\5.9.3\mingw53_32\include\QtGui -I..\..\..\..\Qt\Qt5.9.3\5.9.3\mingw53_32\include\QtANGLE -I..\..\..\..\Qt\Qt5.9.3\5.9.3\mingw53_32\include\QtCore -Idebug -I..\..\..\..\Qt\Qt5.9.3\5.9.3\mingw53_32\mkspecs\win32-g++ -o debug\mail_service.o ..\GoogleMockTest2\mail_service.cpp
g++ -Wl,-subsystem,console -mthreads -o debug\GoogleMockTest2.exe debug/order.o debug/gtest-all.o debug/warehouse.o debug/mail_service.o -LC:\Qt\Qt5.9.3\5.9.3\mingw53_32\lib C:\Qt\Qt5.9.3\5.9.3\mingw53_32\lib\libQt5Guid.a C:\Qt\Qt5.9.3\5.9.3\mingw53_32\lib\libQt5Cored.a
debug/order.o: In function `ZN19OrderTest_Fill_Test8TestBodyEv':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/order.cpp:44: undefined reference to `testing::Matcher<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::Matcher(char const*)'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1416: undefined reference to `testing::Mock::UnregisterLocked(testing::internal::UntypedFunctionMockerBase*)'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1418: undefined reference to `testing::internal::UntypedFunctionMockerBase::~UntypedFunctionMockerBase()'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEED1Ev':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1414: undefined reference to `testing::internal::g_gmock_mutex'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1415: undefined reference to `testing::internal::UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked()'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1416: undefined reference to `testing::Mock::UnregisterLocked(testing::internal::UntypedFunctionMockerBase*)'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1418: undefined reference to `testing::internal::UntypedFunctionMockerBase::~UntypedFunctionMockerBase()'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEC2Ev':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1407: undefined reference to `testing::internal::UntypedFunctionMockerBase::UntypedFunctionMockerBase()'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1407: undefined reference to `testing::internal::UntypedFunctionMockerBase::~UntypedFunctionMockerBase()'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEED2Ev':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1414: undefined reference to `testing::internal::g_gmock_mutex'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1415: undefined reference to `testing::internal::UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked()'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1416: undefined reference to `testing::Mock::UnregisterLocked(testing::internal::UntypedFunctionMockerBase*)'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1418: undefined reference to `testing::internal::UntypedFunctionMockerBase::~UntypedFunctionMockerBase()'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEED1Ev':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1414: undefined reference to `testing::internal::g_gmock_mutex'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1415: undefined reference to `testing::internal::UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked()'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1416: undefined reference to `testing::Mock::UnregisterLocked(testing::internal::UntypedFunctionMockerBase*)'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1418: undefined reference to `testing::internal::UntypedFunctionMockerBase::~UntypedFunctionMockerBase()'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFviNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEC2Ev':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1407: undefined reference to `testing::internal::UntypedFunctionMockerBase::UntypedFunctionMockerBase()'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1407: undefined reference to `testing::internal::UntypedFunctionMockerBase::~UntypedFunctionMockerBase()'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFviNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEED2Ev':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1414: undefined reference to `testing::internal::g_gmock_mutex'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1415: undefined reference to `testing::internal::UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked()'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1416: undefined reference to `testing::Mock::UnregisterLocked(testing::internal::UntypedFunctionMockerBase*)'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1418: undefined reference to `testing::internal::UntypedFunctionMockerBase::~UntypedFunctionMockerBase()'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFviNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEED1Ev':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1414: undefined reference to `testing::internal::g_gmock_mutex'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1415: undefined reference to `testing::internal::UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked()'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1416: undefined reference to `testing::Mock::UnregisterLocked(testing::internal::UntypedFunctionMockerBase*)'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1418: undefined reference to `testing::internal::UntypedFunctionMockerBase::~UntypedFunctionMockerBase()'
debug/order.o: In function `ZN7testing8internal8MockSpecIFbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE18InternalExpectedAtEPKciSB_SB_':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1271: undefined reference to `testing::internal::LogWithLocation(testing::internal::LogSeverity, char const*, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
debug/order.o: In function `ZN7testing8internal16TypedExpectationIFbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE5TimesEi':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:932: undefined reference to `testing::Exactly(int)'
debug/order.o: In function `ZN7testing8internal16TypedExpectationIFbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE8WillOnceERKNS_6ActionIS8_EE':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1002: undefined reference to `testing::Exactly(int)'
debug/order.o: In function `ZN7testing8internal8MockSpecIFviNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE18InternalExpectedAtEPKciSB_SB_':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1271: undefined reference to `testing::internal::LogWithLocation(testing::internal::LogSeverity, char const*, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
debug/order.o: In function `ZN7testing8internal16TypedExpectationIFviNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE5TimesEi':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:932: undefined reference to `testing::Exactly(int)'
debug/order.o: In function `ZN7testing8internal8MockSpecIFvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE18InternalExpectedAtEPKciSB_SB_':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1271: undefined reference to `testing::internal::LogWithLocation(testing::internal::LogSeverity, char const*, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
debug/order.o: In function `ZN7testing8internal16TypedExpectationIFvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE5TimesEi':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:932: undefined reference to `testing::Exactly(int)'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE10InvokeWithERKSt5tupleIJiS7_EE':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1529: undefined reference to `testing::internal::UntypedFunctionMockerBase::UntypedInvokeWith(void const*)'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFviNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE10InvokeWithERKSt5tupleIJiS7_EE':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1529: undefined reference to `testing::internal::UntypedFunctionMockerBase::UntypedInvokeWith(void const*)'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE25ClearDefaultActionsLockedEv':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1560: undefined reference to `testing::Expectation::~Expectation()'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1551: undefined reference to `testing::internal::UntypedFunctionMockerBase::MockObject() const'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1551: undefined reference to `testing::Mock::RegisterUseByOnCallOrExpectCall(void const*, char const*, int)'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1558: undefined reference to `testing::internal::g_gmock_implicit_sequence'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1560: undefined reference to `testing::Expectation::Expectation(testing::internal::linked_ptr<testing::internal::ExpectationBase> const&)'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1560: undefined reference to `testing::Sequence::AddExpectation(testing::Expectation const&) const'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1560: undefined reference to `testing::Expectation::~Expectation()'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1560: undefined reference to `testing::Expectation::~Expectation()'
debug/order.o: In function `ZN7testing8internal16TypedExpectationIFvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE5TimesERKNS_11CardinalityE':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:926: undefined reference to `testing::internal::ExpectationBase::UntypedTimes(testing::Cardinality const&)'
debug/order.o: In function `ZN7testing8internal16TypedExpectationIFbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEC1EPNS0_18FunctionMockerBaseIS8_EEPKciRKS7_RKSt5tupleIJNS_7MatcherIiEENSI_IS7_EEEE':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:894: undefined reference to `testing::internal::ExpectationBase::ExpectationBase(char const*, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:894: undefined reference to `testing::internal::ExpectationBase::~ExpectationBase()'
debug/order.o: In function `ZN7testing8internal16TypedExpectationIFviNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEC1EPNS0_18FunctionMockerBaseIS8_EEPKciRKS7_RKSt5tupleIJNS_7MatcherIiEENSI_IS7_EEEE':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:899: undefined reference to `testing::internal::ExpectationBase::CheckActionCountIfNotDone() const'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:904: undefined reference to `testing::internal::ExpectationBase::~ExpectationBase()'
debug/order.o: In function `ZN7testing8internal16TypedExpectationIFbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE9GetHandleEv':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1077: undefined reference to `testing::internal::UntypedFunctionMockerBase::GetHandleOf(testing::internal::ExpectationBase*)'
debug/order.o: In function `ZNK7testing8internal18FunctionMockerBaseIFvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE32UntypedDescribeUninterestingCallEPKvPSo':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1603: undefined reference to `testing::internal::UntypedFunctionMockerBase::Name() const'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE30UntypedFindMatchingExpectationEPKvPSB_PbPSoSE_':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1630: undefined reference to `testing::internal::g_gmock_mutex'
debug/order.o: In function `ZNK7testing8internal18FunctionMockerBaseIFviNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE32UntypedDescribeUninterestingCallEPKvPSo':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1603: undefined reference to `testing::internal::UntypedFunctionMockerBase::Name() const'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFviNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE30UntypedFindMatchingExpectationEPKvPSB_PbPSoSE_':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1630: undefined reference to `testing::internal::g_gmock_mutex'
debug/order.o: In function `ZNK7testing8internal18FunctionMockerBaseIFbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE32UntypedDescribeUninterestingCallEPKvPSo':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1603: undefined reference to `testing::internal::UntypedFunctionMockerBase::Name() const'
debug/order.o: In function `ZN7testing8internal18FunctionMockerBaseIFbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE30UntypedFindMatchingExpectationEPKvPSB_PbPSoSE_':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1630: undefined reference to `testing::internal::g_gmock_mutex'
debug/order.o: In function `ZNK7testing8internal18FunctionMockerBaseIFvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE29FindMatchingExpectationLockedERKSt5tupleIJS7_EE':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1661: undefined reference to `testing::internal::g_gmock_mutex'
debug/order.o: In function `ZNK7testing8internal18FunctionMockerBaseIFvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE33FormatUnexpectedCallMessageLockedERKSt5tupleIJS7_EEPSoSE_':
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1110: undefined reference to `testing::internal::g_gmock_mutex'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1128: undefined reference to `testing::internal::ExpectationBase::AllPrerequisitesAreSatisfied() const'
C:\Users\PB9N0052\Documents\build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug/../GoogleMockTest2/google/gmock/include/gmock/gmock-spec-builders.h:1133: undefined reference to `testing::internal::ExpectationBase::FindUnsatisfiedPrerequisites(testing::ExpectationSet*) const'
collect2.exe: error: ld returned 1 exit status
mingw32-make[1]: *** [debug\GoogleMockTest2.exe] Error 1
mingw32-make: *** [debug] Error 2
Makefile.Debug:74: recipe for target 'debug\GoogleMockTest2.exe' failed
mingw32-make[1]: Leaving directory 'C:/Users/PB9N0052/Documents/build-GoogleMockTest2-Desktop_Qt_5_9_3_MinGW_32bit-Debug'
Makefile:36: recipe for target 'debug' failed
10:53:32: The process "C:\Qt\Qt5.9.3\Tools\mingw530_32\bin\mingw32-make.exe" exited with code 2.
Error while building/deploying project GoogleMockTest2 (kit: Desktop Qt 5.9.3 MinGW 32bit)
When executing step "Make"
10:53:32: Elapsed time: 00:07.

Maybe you forgot to add in your sources the ".cc" files of gmock.
Because in your .pro file, you only added the ".cc" files of gtest.
What I always do is, "add existing files" then look for the src folder of the gmock.
And add the .cc files.
Like this sample:
SOURCES += \
../calculator.cpp \
../button.cpp \
main.cpp \
gtest/src/gtest.cc \
gtest/src/gtest-all.cc \
gtest/src/gtest-death-test.cc \
gtest/src/gtest-filepath.cc \
gtest/src/gtest-port.cc \
gtest/src/gtest-printers.cc \
gtest/src/gtest-test-part.cc \
gtest/src/gtest-typed-test.cc \
gmock/src/gmock-spec-builders.cc \
gmock/src/gmock-matchers.cc \
gmock/src/gmock-internal-utils.cc \
gmock/src/gmock-cardinalities.cc \
gmock/src/gmock-all.cc \
gmock/src/gmock.cc

My new .pro file
CONFIG += console c++14
INCLUDEPATH += "google/googlemock/include/"
INCLUDEPATH += "google/googlemock/"
INCLUDEPATH += "google/googletest/include/"
INCLUDEPATH += "google/googletest/src/"
INCLUDEPATH += "google/googletest/"
INCLUDEPATH += "google/"
INCLUDEPATH += "../../"
SOURCES += \
order.cpp \
google/googletest/src/gtest.cc \
google/googletest/src/gtest-all.cc \
google/googletest/src/gtest-death-test.cc \
google/googletest/src/gtest-filepath.cc \
google/googletest/src/gtest-port.cc \
google/googletest/src/gtest-printers.cc \
google/googletest/src/gtest-test-part.cc \
google/googletest/src/gtest-typed-test.cc \
google/googlemock/src/gmock.cc \
google/googlemock/src/gmock-all.cc \
google/googlemock/src/gmock-cardinalities.cc \
google/googlemock/src/gmock-internal-utils.cc \
google/googlemock/src/gmock-matchers.cc \
google/googlemock/src/gmock-spec-builders.cc
HEADERS += \
mail_service.hpp \
order.hpp \
warehouse.hpp

I had the same issue and the pointer to include the source files for gmock and gtest is the correct lead, but I still got errors on linkage (i'm using CMake).
The error was for multiple definition of functions. The issue was that gtest-all.cc includes all the relevant sources for gtest (and gmock-all.cc does the same for gmock sources). So all you need to do is include gtest-all.cc and gmock-all.cc:
SOURCES += \
../calculator.cpp \
../button.cpp \
main.cpp \
gtest/src/gtest-all.cc \
gmock/src/gmock-all.cc
This is also much cleaner.
I hope this is a good complimentary solution for the answer above, as it solves the next issue in line (at least for me).

Related

Linking issues Boost.Python

Trying to use Boost Python, but getting linkage issues.
Code, hello.cpp:
#include <boost/python.hpp>
char const* greet() {
return "hellow, world";
}
int main() {
return 0;
}
BOOST_PYTHON_MODULE(hello_ext) {
using namespace boost::python;
def("greet", greet);
}
Compiling with:
g++ hello.cpp -L/usr/lib/x86_64-linux-gnu/ -I/usr/include/python3.5/ -lboost_python /usr/lib/x86_64-linux-gnu/libpython3.5m.so -lboost_system
Getting the following linkage errors:
tmp/ccJ8ST4B.o: In function `PyInit_hello_ext':
hello.cpp:(.text+0x94): undefined reference to `boost::python::detail::init_module(PyModuleDef&, void (*)())'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `PyString_Size'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `PyUnicodeUCS4_FromEncodedObject'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `PyFile_FromString'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `PyString_Type'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `PyInt_Type'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `PyString_FromString'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `PyUnicodeUCS4_AsWideChar'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `PyString_FromStringAndSize'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `Py_InitModule4_64'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `PyString_FromFormat'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `PyNumber_Divide'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `PyNumber_InPlaceDivide'
/usr/lib/x86_64-linux-gnu//libboost_python.so: undefined reference to `PyInt_AsLong'
Any ideas?
Here while compiling give proper, exact and ordered path for libraries. Please use below command and try, If it doesn't work set LD_LIBRARY_PATH(set in program dir path only) to program directory path. This will link all the required library to your program directory.
g++ -I/usr/include/python3.5/ /usr/lib/x86_64-linux-gnu/libpython3.5m.so -L/usr/lib/x86_64-linux-gnu/ -lboost_python -lboost_system hello.cpp -o hello
If above line do not work
export LD_LIBRARY_PATH=/program_path:$LD_LIBRARY_PATH

Can't link libpcrecpp w/ MinGW

While compiling/linking this code:
#include <string>
using std::string;
#include <pcrecpp.h>
using pcrecpp::RE;
int main() {
string
subj ("Hello world!"),
rgx ("lolCat([0-9])"),
result;
RE(rgx).FullMatch(subj, &result);
}
... by using this command:
i586-mingw32msvc-g++ -std=c++11 -o test.exe -Ipcre-install/include test.cpp \
pcre-install/lib/libpcre.a \
pcre-install/lib/libpcrecpp.a \
pcre-install/lib/libpcreposix.a
... I get this error(s):
/tmp/ccAR72nT.o:test.cpp:(.text+0x119): undefined reference to `_imp___ZN7pcrecpp2RE6no_argE'
/tmp/ccAR72nT.o:test.cpp:(.text+0x123): undefined reference to `_imp___ZN7pcrecpp2RE6no_argE'
/tmp/ccAR72nT.o:test.cpp:(.text+0x12d): undefined reference to `_imp___ZN7pcrecpp2RE6no_argE'
/tmp/ccAR72nT.o:test.cpp:(.text+0x137): undefined reference to `_imp___ZN7pcrecpp2RE6no_argE'
/tmp/ccAR72nT.o:test.cpp:(.text+0x141): undefined reference to `_imp___ZN7pcrecpp2RE6no_argE'
/tmp/ccAR72nT.o:test.cpp:(.text+0x14b): more undefined references to `_imp___ZN7pcrecpp2RE6no_argE' follow
/tmp/ccAR72nT.o:test.cpp:(.text+0x1bd): undefined reference to `_imp___ZNK7pcrecpp2RE9FullMatchERKNS_11StringPieceERKNS_3ArgES6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_S6_'
/tmp/ccAR72nT.o:test.cpp:(.text+0x1d6): undefined reference to `_imp___ZN7pcrecpp2RED1Ev'
/tmp/ccAR72nT.o:test.cpp:(.text+0x294): undefined reference to `_imp___ZN7pcrecpp2RED1Ev'
/tmp/ccAR72nT.o:test.cpp:(.text$_ZN7pcrecpp3ArgC1EPSs[__ZN7pcrecpp3ArgC1EPSs]+0x16): undefined reference to `_imp___ZN7pcrecpp3Arg12parse_stringEPKciPv'
/tmp/ccAR72nT.o:test.cpp:(.text$_ZN7pcrecpp2REC1ERKSs[__ZN7pcrecpp2REC1ERKSs]+0x6a): undefined reference to `_imp___ZN7pcrecpp2RE4InitERKSsPKNS_10RE_OptionsE'
collect2: error: ld returned 1 exit status
Am I doing anything wrong?
libpcrecpp was compiled with this configuration:
../pcre3-8.35/configure --host=i586-mingw32msvc \
--enable-shared=no --enable-static=yes \
--prefix="$(readlink -m ../pcre-install)"
You have compile pcrecpp as static library and you need to define PCRE_STATIC when compiling your code, see https://github.com/vmg/pcre/blob/a257f5c7acc12e64dc2b5aa170b8e4b87dc34f83/pcreposix.h#L117
i586-mingw32msvc-g++ -std=c++11 -o test.exe -DPCRE_STATIC -Ipcre-install/include test.cpp \
pcre-install/lib/libpcre.a \
pcre-install/lib/libpcrecpp.a \
pcre-install/lib/libpcreposix.a
Without PCRE_STATIC all public functions marked as dllimport and have different name mangling
You must define PCRE_STATIC (i.e. -DPCRE_STATIC).

gcc Linker and OGDF "undefined reference to `ogdf::Initialization::Initialization()'"

I am trying to get OGDF working to see if it is suitable for my project, but I am having trouble with a sample program.
I am trying to compile this example program:
#include <ogdf/basic/Graph.h>
#include <ogdf/basic/graph_generators.h>
#include <ogdf/layered/DfsAcyclicSubgraph.h>
using namespace ogdf;
int main()
{
Graph G;
randomSimpleGraph(G, 10, 20);
DfsAcyclicSubgraph DAS;
DAS.callAndReverse(G);
G.writeGML("test.gml");
return 0;
}
using this command:
$g++ -pthread -I ./OGDF/ -L ./OGDF/_release/ -lOGDF test2.cpp
But I get the following error
/tmp/ccbpkfdt.o: In function `main':
test2.cpp:(.text+0x12): undefined reference to `ogdf::Graph::Graph()'
test2.cpp:(.text+0x2e): undefined reference to `ogdf::randomSimpleGraph(ogdf::Graph&, int, int)'
test2.cpp:(.text+0x4e): undefined reference to `ogdf::AcyclicSubgraphModule::callAndReverse(ogdf::Graph&)'
test2.cpp:(.text+0x62): undefined reference to `ogdf::Graph::writeGML(char const*) const'
test2.cpp:(.text+0x7f): undefined reference to `ogdf::Graph::~Graph()'
test2.cpp:(.text+0xa1): undefined reference to `ogdf::Graph::~Graph()'
/tmp/ccbpkfdt.o: In function `__static_initialization_and_destruction_0(int, int)':
test2.cpp:(.text+0xfb): undefined reference to `ogdf::Initialization::Initialization()'
test2.cpp:(.text+0x112): undefined reference to `ogdf::Initialization::~Initialization()'
/tmp/ccbpkfdt.o: In function `ogdf::DfsAcyclicSubgraph::DfsAcyclicSubgraph()':
test2.cpp:(.text._ZN4ogdf18DfsAcyclicSubgraphC2Ev[_ZN4ogdf18DfsAcyclicSubgraphC5Ev]+0x16): undefined reference to `vtable for ogdf::DfsAcyclicSubgraph'
/tmp/ccbpkfdt.o: In function `ogdf::DfsAcyclicSubgraph::~DfsAcyclicSubgraph()':
test2.cpp:(.text._ZN4ogdf18DfsAcyclicSubgraphD2Ev[_ZN4ogdf18DfsAcyclicSubgraphD5Ev]+0xb): undefined reference to `vtable for ogdf::DfsAcyclicSubgraph'
collect2: error: ld returned 1 exit status
I tried compiling hello world, with an include from OGDF, and I still got:
undefined reference to `ogdf::Initialization::Initialization()'
I think I am not linking properly or something?
You have to be very careful in which order you type stuff when linking with a library.
Try putting test2.cpp before -lOGDF instead, like this:
g++ -pthread -I ./OGDF/ -L ./OGDF/_release/ test2.cpp -lOGDF
You must build your program using the -DOGDF_DLL when using OGDF as a shared library.
See here: http://www.ogdf.net/doku.php/tech:defines

Linking D library to C++ code

Recently I learned the beautiful language D, which is so more plastic and helps yourself writing stable fast programs. But its not popular... because few code written on D and so more on C and C++. Therefore after I read the book of Andrei Alexanderscu where author very superficially described question about linking of D library to C++ code, I tried learn it myself and written some code on D where defined function that returns an instance of CompleteAutomata class which implements AutomataInterface defined also in C++ code:
#ifndef AUTOMATAINTERFACE_H
#define AUTOMATAINTERFACE_H
class AutomataInterface {
public:
virtual ~AutomataInterface() {}
virtual void next() = 0;
virtual void save() = 0;
virtual void restore() = 0;
virtual void zerofile() = 0;
virtual void invert(unsigned long x, unsigned long y) = 0;
virtual int state(unsigned long x, unsigned long y) const = 0;
virtual unsigned long x() const = 0;
virtual unsigned long y() const = 0;
};
AutomataInterface *createAutomata(unsigned long x, unsigned long y);
#endif // AUTOMATAINTERFACE_H
Relevant D code:
import agregator; // this is my own lib
extern(C++) {
interface AutomataInterface {
void next();
void save();
void restore();
void zerofile();
void invert(size_t x, size_t y);
int state(size_t x, size_t y) const;
size_t x() const;
size_t y() const;
}
AutomataInterface createAutomata(ulong x, ulong y) {
return new CompleteAutomata(x, y);
}
}
export class CompleteAutomata : AutomataInterface {
// instance variables...
this(size_t x, size_t y) { /* ... */ }
extern(C++) {
override void next() {
// ...
}
// others overridden interface methods...
}
}
After code had written, I've compiling of D library by two different compilers (dmd and gdc), with following flags:
dmd -release -O -lib -odlib -ofliblife.h *.d
or
gdc -frelease -O2 -Wall -c *.d
ar cq lib/liblife.a *.o
When I trying link each of received libs to Qt project by adding path to library dir (-L option) and adding a lib directly (-l option). I got errors of in both cases.
In first dmd case I have "undefined reference to `_d_newclass'" and couple of another errors:
g++ -Wl,-O1 -Wl,-z,relro -o automata main.o mainwindow.o renderarea.o button.o playbutton.o moc_mainwindow.o moc_renderarea.o moc_button.o moc_playbutton.o -L/home/newmen/projects/d/life/lib -llife -lQtGui -lQtCore -lpthread
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1fe_5b0.o): In function `createAutomata(unsigned int, unsigned int)':
complete_automata.d:(.text._Z14createAutomatajj+0x27): undefined reference to `_d_newclass'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.data+0x0): undefined reference to `_D14TypeInfo_Class6__vtblZ'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.data+0x50): undefined reference to `_D6Object7__ClassZ'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.data+0xd0): undefined reference to `_D14TypeInfo_Class6__vtblZ'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.data+0x120): undefined reference to `_D6Object7__ClassZ'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x68): undefined reference to `_D6object6Object8toStringMFZAya'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x70): undefined reference to `_D6object6Object6toHashMFNbNeZm'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x78): undefined reference to `_D6object6Object5opCmpMFC6ObjectZi'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x80): undefined reference to `_D6object6Object8opEqualsMFC6ObjectZb'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0xf8): undefined reference to `_D6object6Object8toStringMFZAya'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x100): undefined reference to `_D6object6Object6toHashMFNbNeZm'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x108): undefined reference to `_D6object6Object5opCmpMFC6ObjectZi'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x110): undefined reference to `_D6object6Object8opEqualsMFC6ObjectZb'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o): In function `_D17complete_automata16CompleteAutomata6__ctorMFmmZC17complete_automata16CompleteAutomata':
complete_automata.d:(.text._D17complete_automata16CompleteAutomata6__ctorMFmmZC17complete_automata16CompleteAutomata+0x1f): undefined reference to `_d_newclass'
complete_automata.d:(.text._D17complete_automata16CompleteAutomata6__ctorMFmmZC17complete_automata16CompleteAutomata+0x46): undefined reference to `_d_newclass'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o): In function `CompleteAutomata::next()':
complete_automata.d:(.text._ZN16CompleteAutomata4nextEv+0x2f): undefined reference to `_d_newclass'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o): In function `CompleteAutomata::save()':
complete_automata.d:(.text._ZN16CompleteAutomata4saveEv+0x25): undefined reference to `_adDupT'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o): In function `CompleteAutomata::restore()':
complete_automata.d:(.text._ZN16CompleteAutomata7restoreEv+0x33): undefined reference to `_d_newclass'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o): In function `CompleteAutomata::zerofile()':
complete_automata.d:(.text._ZN16CompleteAutomata8zerofileEv+0x2f): undefined reference to `_d_newclass'
/home/newmen/projects/d/life/lib/liblife.a(object_201_8b7.o): In function `no symbol':
/usr/include/dmd/druntime/import/object.di:(.text+0x6): undefined reference to `_Dmodule_ref'
/home/newmen/projects/d/life/lib/liblife.a(object_201_8b7.o):(.data._D12TypeInfo_Axi6__initZ+0x0): undefined reference to `_D14TypeInfo_Array6__vtblZ'
/home/newmen/projects/d/life/lib/liblife.a(object_201_8b7.o): In function `_D46/usr/include/dmd/druntime/import/object.di.5137__arrayZ':
/usr/include/dmd/druntime/import/object.di:(.text._D46/usr/include/dmd/druntime/import/object.di.5137__arrayZ+0x16): undefined reference to `_d_array_bounds'
/home/newmen/projects/d/life/lib/liblife.a(object_201_8b7.o): In function `_D46/usr/include/dmd/druntime/import/object.di.5138__assertFiZv':
/usr/include/dmd/druntime/import/object.di:(.text._D46/usr/include/dmd/druntime/import/object.di.5138__assertFiZv+0x16): undefined reference to `_d_assertm'
/home/newmen/projects/d/life/lib/liblife.a(object_201_8b7.o): In function `_D46/usr/include/dmd/druntime/import/object.di.51315__unittest_failFiZv':
/usr/include/dmd/druntime/import/object.di:(.text._D46/usr/include/dmd/druntime/import/object.di.51315__unittest_failFiZv+0x16): undefined reference to `_d_unittestm'
/home/newmen/projects/d/life/lib/liblife.a(object_203_875.o): In function `no symbol':
/usr/include/dmd/druntime/import/object.di:(.text+0x6): undefined reference to `_Dmodule_ref'
/home/newmen/projects/d/life/lib/liblife.a(object_203_875.o):(.data._D11TypeInfo_xi6__initZ+0x0): undefined reference to `_D14TypeInfo_Const6__vtblZ'
/home/newmen/projects/d/life/lib/liblife.a(object_203_875.o):(.data._D11TypeInfo_xi6__initZ+0x10): undefined reference to `_D10TypeInfo_i6__initZ'
/home/newmen/projects/d/life/lib/liblife.a(object_203_875.o): In function `_D46/usr/include/dmd/druntime/import/object.di.5157__arrayZ':
/usr/include/dmd/druntime/import/object.di:(.text._D46/usr/include/dmd/druntime/import/object.di.5157__arrayZ+0x16): undefined reference to `_d_array_bounds'
/home/newmen/projects/d/life/lib/liblife.a(object_203_875.o): In function `_D46/usr/include/dmd/druntime/import/object.di.5158__assertFiZv':
/usr/include/dmd/druntime/import/object.di:(.text._D46/usr/include/dmd/druntime/import/object.di.5158__assertFiZv+0x16): undefined reference to `_d_assertm'
/home/newmen/projects/d/life/lib/liblife.a(object_203_875.o): In function `_D46/usr/include/dmd/druntime/import/object.di.51515__unittest_failFiZv':
/usr/include/dmd/druntime/import/object.di:(.text._D46/usr/include/dmd/druntime/import/object.di.51515__unittest_failFiZv+0x16): undefined reference to `_d_unittestm'
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `no symbol':
agregator.d:(.text+0x6): undefined reference to `_Dmodule_ref'
/home/newmen/projects/d/life/lib/liblife.a(agregator.o):(.data+0x10): undefined reference to `_D3std6random12__ModuleInfoZ'
/home/newmen/projects/d/life/lib/liblife.a(agregator.o):(.rodata+0x20): undefined reference to `_D14TypeInfo_Class6__vtblZ'
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `_D9agregator7__arrayZ':
agregator.d:(.text._D9agregator7__arrayZ+0x16): undefined reference to `_d_array_bounds'
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `_D9agregator8__assertFiZv':
agregator.d:(.text._D9agregator8__assertFiZv+0x16): undefined reference to `_d_assertm'
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `_D9agregator15__unittest_failFiZv':
agregator.d:(.text._D9agregator15__unittest_failFiZv+0x16): undefined reference to `_d_unittestm'
/home/newmen/projects/d/life/lib/liblife.a(agregator_2_5fd.o):(.data+0x0): undefined reference to `_D14TypeInfo_Class6__vtblZ'
/home/newmen/projects/d/life/lib/liblife.a(agregator_2_5fd.o):(.data+0x50): undefined reference to `_D6Object7__ClassZ'
/home/newmen/projects/d/life/lib/liblife.a(agregator_2_5fd.o):(.rodata+0x48): undefined reference to `_D6object6Object8toStringMFZAya'
...
In second case (when using gdc) I receives message about "multiple definition of":
g++ -Wl,-O1 -Wl,-z,relro -o cellular_life main.o mainwindow.o renderarea.o button.o playbutton.o moc_mainwindow.o moc_renderarea.o moc_button.o moc_playbutton.o -L/home/newmen/projects/d/life/lib -llife -lQtGui -lQtCore -lpthread
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `_D17complete_automata16CompleteAutomata7restoreMRZv14SliceAgregator9initValueMxFmmZi':
complete_automata.d:(.text+0x0): multiple definition of `_D17complete_automata16CompleteAutomata7restoreMRZv14SliceAgregator9initValueMxFmmZi'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._D17complete_automata16CompleteAutomata7restoreMRZv14SliceAgregator9initValueMxFmmZi+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::invert(unsigned long long, unsigned long long)':
complete_automata.d:(.text+0x40): multiple definition of `CompleteAutomata::invert(unsigned long long, unsigned long long)'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZN16CompleteAutomata6invertEyy+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::state(unsigned long long, unsigned long long) const':
complete_automata.d:(.text+0x60): multiple definition of `CompleteAutomata::state(unsigned long long, unsigned long long) const'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZNK16CompleteAutomata5stateEyy+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::x() const':
complete_automata.d:(.text+0x80): multiple definition of `CompleteAutomata::x() const'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZNK16CompleteAutomata1xEv+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::y() const':
complete_automata.d:(.text+0xa0): multiple definition of `CompleteAutomata::y() const'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZNK16CompleteAutomata1yEv+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::next()':
complete_automata.d:(.text+0x140): multiple definition of `CompleteAutomata::next()'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZN16CompleteAutomata4nextEv+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.tbss+0x10): multiple definition of `_D17complete_automata16CompleteAutomata4nextMRZv7changerC7changer7Changer'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.tbss+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::restore()':
complete_automata.d:(.text+0x1b0): multiple definition of `CompleteAutomata::restore()'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZN16CompleteAutomata7restoreEv+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.tbss+0x8): multiple definition of `_D17complete_automata16CompleteAutomata7restoreMRZv9agregatorC9agregator9Agregator'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.tbss+0x8): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.data+0x180): multiple definition of `_D_ZN16CompleteAutomata7restoreEv14SliceAgregator7__ClassZ'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.data+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::zerofile()':
complete_automata.d:(.text+0x220): multiple definition of `CompleteAutomata::zerofile()'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZN16CompleteAutomata8zerofileEv+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.tbss+0x0): multiple definition of `_D17complete_automata16CompleteAutomata8zerofileMRZv9agregatorC9agregator9Agregator'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.tbss+0x10): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::save()':
complete_automata.d:(.text+0x290): multiple definition of `CompleteAutomata::save()'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZN16CompleteAutomata4saveEv+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.data+0x80): multiple definition of `_D17complete_automata16CompleteAutomata7__ClassZ'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.data+0xd0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `_D17complete_automata16CompleteAutomata6__ctorMFmmZC17complete_automata16CompleteAutomata':
complete_automata.d:(.text+0x9b0): multiple definition of `_D17complete_automata16CompleteAutomata6__ctorMFmmZC17complete_automata16CompleteAutomata'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._D17complete_automata16CompleteAutomata6__ctorMFmmZC17complete_automata16CompleteAutomata+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.rodata+0x420): multiple definition of `_D17complete_automata16CompleteAutomata6__vtblZ'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0xf0): first defined here
/usr/bin/ld: Warning: size of symbol `_D17complete_automata16CompleteAutomata6__vtblZ' changed from 104 in /home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o) to 112 in /home/newmen/projects/d/life/lib/liblife.a(complete_automata.o)
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.rodata+0x4a0): multiple definition of `_D17complete_automata16CompleteAutomata6__initZ'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x90): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.rodata+0x4e0): multiple definition of `_D_ZN16CompleteAutomata7restoreEv14SliceAgregator6__vtblZ'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x60): first defined here
/usr/bin/ld: Warning: size of symbol `_D_ZN16CompleteAutomata7restoreEv14SliceAgregator6__vtblZ' changed from 48 in /home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o) to 56 in /home/newmen/projects/d/life/lib/liblife.a(complete_automata.o)
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.rodata+0x520): multiple definition of `_D_ZN16CompleteAutomata7restoreEv14SliceAgregator6__initZ'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `_D3std7complex14__T7ComplexTeZ7Complex8toStringMxFMDFAxaZvAyaZAya12__lambda1223MFNbNfAxaZv':
agregator.d:(.text+0xaf): undefined reference to `_D11TypeInfo_Aa6__initZ'
agregator.d:(.text+0xb7): undefined reference to `_d_arrayappendT'
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `_D3std4conv16__T6toImplTiTxkZ6toImplFNaNfxkZi15__dgliteral1389MFNaNfZC6object9Throwable':
agregator.d:(.text+0xc5): undefined reference to `_D3std4conv21ConvOverflowException7__ClassZ'
agregator.d:(.text+0xca): undefined reference to `_d_newclass'
agregator.d:(.text+0xed): undefined reference to `_D3std4conv21ConvOverflowException6__ctorMFAyaAyamZC3std4conv21ConvOverflowException'
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `_D3std6format17__T9getNthIntTxeZ9getNthIntFNaNfkxeZi.part.6':
agregator.d:(.text+0x105): undefined reference to `_D3std6format15FormatException7__ClassZ'
agregator.d:(.text+0x10a): undefined reference to `_d_newclass'
...
After two days of attempts to do so...
Recently I've try add Phobos (D standard library) to linking process. For dmd -lphobos2 flag and for gdc -lgphobos2 flag correspond. But it not help me...
When using dmd linker output:
g++ -Wl,-O1 -Wl,-z,relro -o cellular_life main.o mainwindow.o renderarea.o button.o playbutton.o moc_mainwindow.o moc_renderarea.o moc_button.o moc_playbutton.o -L/home/newmen/projects/d/life/lib -llife -lQtGui -lQtCore -lpthread -lphobos2
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `curl_easy_duphandle#CURL_GNUTLS_3'
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `curl_easy_strerror#CURL_GNUTLS_3'
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `curl_slist_free_all#CURL_GNUTLS_3'
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `curl_global_init#CURL_GNUTLS_3'
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `curl_easy_perform#CURL_GNUTLS_3'
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `curl_easy_init#CURL_GNUTLS_3'
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `curl_easy_pause#CURL_GNUTLS_3'
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `_Dmain'
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `curl_easy_setopt#CURL_GNUTLS_3'
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `curl_slist_append#CURL_GNUTLS_3'
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `curl_global_cleanup#CURL_GNUTLS_3'
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `curl_easy_cleanup#CURL_GNUTLS_3'
collect2: error: ld returned 1 exit status
make: *** [cellular_life] Error 1
and I've try substitute of libcurl-gnutls: ln -s /usr/lib64/libcurl.so.4 /usr/lib64/libcurl-gnutls.so.4. Then result of linking the same but without message about libcurl-gnutls.
When using gdc linker output again talk about "multiple definition to":
/home/newmen/gcc/bin/g++ -Wl,-O1 -Wl,-z,relro -o cellular_life main.o mainwindow.o renderarea.o button.o playbutton.o moc_mainwindow.o moc_renderarea.o moc_button.o moc_playbutton.o -L/home/newmen/gcc/lib64 -L/home/newmen/projects/d/life/lib -llife -lQtGui -lQtCore -lpthread -lgphobos2
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `_D17complete_automata16CompleteAutomata7restoreMRZv14SliceAgregator9initValueMxFmmZi':
complete_automata.d:(.text+0x0): multiple definition of `_D17complete_automata16CompleteAutomata7restoreMRZv14SliceAgregator9initValueMxFmmZi'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1e3_675.o):complete_automata.d:(.text._D17complete_automata16CompleteAutomata7restoreMRZv14SliceAgregator9initValueMxFmmZi+0x0): first defined here
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::invert(unsigned long long, unsigned long long)':
complete_automata.d:(.text+0x40): multiple definition of `CompleteAutomata::invert(unsigned long long, unsigned long long)'
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1e3_675.o):complete_automata.d:(.text._ZN16CompleteAutomata6invertEyy+0x0): first defined here
...
/home/newmen/gcc/lib64/libgphobos2.a(dmain2.o): In function `main':
/home/newmen/projects/distrib/gcc-4.8.1/x86_64-unknown-linux-gnu/libphobos/libdruntime/../../.././libphobos/libdruntime/rt/dmain2.d:394: multiple definition of `main'
main.o:/home/newmen/projects/d/life/qt_viewer/main.cpp:5: first defined here
/usr/bin/ld: /home/newmen/gcc/lib64/libgphobos2.a(time.o): undefined reference to symbol 'clock_getres##GLIBC_2.2.5'
/usr/bin/ld: note: 'clock_getres##GLIBC_2.2.5' is defined in DSO /lib64/librt.so.1 so try adding it to the linker command line
/lib64/librt.so.1: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
make: *** [cellular_life] Error 1
with message about librt.so.1 at end. I inspect /usr/lib64 and seen there it library file.
Dear magic, please tell me how to connect the D library to C++ code.
It is generally easier to let the D compiler do the linking:
g++ -c yourfile.cpp
dmd yourfile.o d_file.d
You might have to add curl to it as well, same as you did before. To pass a linker argument through dmd (or gdmd if you're using gdc, should work the same way), pass -Larg
dmd yourfile.o d_file.d -L-lstdc++ -L-lcurl -L-lQtGui # and so on
It is generally easier to put main() in D too (it can just immediately call out to a C++ defined function too) because otherwise you'll probably have to initialize the D runtime before using it from C++.
But to finish the process you've started... first thing, looks like your liblife.a has the same file added twice. I'd try deleting that file and recreating it, or just skipping that step and passing the .o files to the linker directly without first packing them into a .a. That'll simplify things a bit.
My other question is: why is it trying to pull the D main? Is there a main() in your .d code somewhere? If so, that's ok, but you'll have to remove the one from your C++ code. (Perhaps rename it into cppmain and then call it from the D main:
D code:
extern(C++) int cppmain(int argc, char** argv);
int main() {
import core.runtime;
return cppmain(Runtime.cArgs.argc, Runtime.cArgs.argv);
}
And that will forward to your C++ main. If you want to remove the D main (assuming it is there, if not let me know and I'll try to think what else could cause that linker error), before tou use D code in C++, you'll want to initialize D. So:
D code:
extern(C++) void initD() {
import core.runtime;
Runtime.initialize();
}
C++ code:
extern "C++" void initD();
int main() {
initD();
// the rest of your stuff
}
If you don't do that, calling D functions is liable to cause a segfault.
But to sum up, I'm pretty sure you have a duplicate .o file added to your archive, and main defined in both D and C++. Delete the duplicate in the archive and kill one of the duplicate mains and you should have some success.

LEDA-6.3 library

I am a leda-6.3 library user.
I used graphwin to manipulate and display graphs, but I found that references
to graphwin methods are undefined while compiling the code although they
are declared in the LEDA/incl/LEDA/graphics/graphwin.h
So I think it is a problem of object file.
#include <LEDA/graphics/graphwin.h>
#include <LEDA/graph/graph_alg.h>
using namespace leda;
int main()
{
GraphWin gw("LEDA Graph Editor");
node u=gw.new_node(point(100,100));
node v=gw.new_node(point(100,200));
gw.new_edge(u,v);
gw.display();
gw.get_window().read_mouse();
graph& G=gw.get_graph();
G.new_node();
gw.get_window().read_mouse();
gw.update_graph();
gw.get_window().read_mouse();
return 0;
}
compilation: g++ -I$LEDAROOT/incl -L$LEDAROOT gw.cpp -lleda -lX11 -lm -o gw
ERROR :
/tmp/ccVHyRbL.o: In function `main':
gw.cpp:(.text+0x1e): undefined reference to `leda::GraphWin::GraphWin(char const*)'
gw.cpp:(.text+0x58): undefined reference to `leda::GraphWin::new_node(leda::point const&)'
gw.cpp:(.text+0xc6): undefined reference to `leda::GraphWin::new_node(leda::point const&)'
gw.cpp:(.text+0x11c): undefined reference to `leda::GraphWin::new_edge(leda::node_struct*, leda::node_struct*)'
gw.cpp:(.text+0x128): undefined reference to `leda::GraphWin::display()'
gw.cpp:(.text+0x17e): undefined reference to `leda::GraphWin::update_graph()'
collect2: ld returned 1 exit status
Which edition of LEDA are you using?
Please consider that free edition of LEDA does not contain GraphWin.
So, it dos not contain GraphWin libraries, which results to getting such errors while compiling your program.