2012-05-12 16 views
5

Sadece C++ ile başlıyorum ve IDE olarak QT içerik oluşturucuyu nasıl kullanacağımı öğreniyorum, bu yüzden bunun gerçekten kolay olabileceğinden şüpheleniyorum ama bir şeyleri kaçırıyor olabilirim. Apollo MQ'yi kurdum ve apache CMS'yi (C++ messaging service) kurdum, böylece sunucuyla C++ arasında etkileşimde bulunabiliyorum. Sorun şu ki, yaptığım şey hakkında hiçbir fikrim yok :-) (henüz) ve örnekleri kullanırken yukarıdaki hatayı aldığımdan emin değilim.QT-yaratıcısı için x86_64 mimarisi için tanımlanmamış semboller

Örneklerin iyi olduğundan eminim, çünkü bunlar kaynağın örnek klasörüne dahil edildiğinden, projenin yapılandırmasının doğru olmadığından şüphelenmeme neden oluyor (gerçekten de üzerinde etkisi olan tek şey olduğu gibi). İşte

drwxr-xr-x 13 root admin 442 May 11 19:09 activemq 
drwxr-xr-x 48 root admin 1632 May 11 19:09 cms 
drwxr-xr-x 9 root admin 306 May 11 19:09 decaf 

var: (istediğim dosyalar tüm alt dizinleri içindedir) İşte

TEMPLATE = app 
CONFIG += console 
CONFIG -= qt 

SOURCES += main.cpp 

INCLUDEPATH += /usr/local/include/activemq-cpp-3.4.2/ 
INCLUDEPATH += /opt/local/lib/ 

Ben işaret ediyorum klasör içeriği olan:

İşte .pro dosyasıdır hata:

20:54:22: Running build steps for project stackexchangeexample... 
20:54:22: Configuration unchanged, skipping qmake step. 
20:54:22: Starting: "/usr/bin/make" -w 
make: Entering directory `/Users/lostsoul/Dropbox/qt_cuda/stackexchangeexample-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK__Debug' 
/Users/lostsoul/QtSDK/Desktop/Qt/4.8.1/gcc/bin/qmake -spec ../../../QtSDK/Desktop/Qt/4.8.1/gcc/mkspecs/macx-g++ CONFIG+=declarative_debug -o Makefile ../stackexchangeexample/stackexchangeexample.pro 
make: Leaving directory `/Users/lostsoul/Dropbox/qt_cuda/stackexchangeexample-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK__Debug' 
make: Entering directory `/Users/lostsoul/Dropbox/qt_cuda/stackexchangeexample-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK__Debug' 
g++ -headerpad_max_install_names -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -o stackexchangeexample.app/Contents/MacOS/stackexchangeexample main.o  
Undefined symbols for architecture x86_64: 
    "activemq::library::ActiveMQCPP::initializeLibrary()", referenced from: 
     _main in main.o 
    "activemq::library::ActiveMQCPP::shutdownLibrary()", referenced from: 
     _main in main.o 
    "activemq::core::ActiveMQConnectionFactory::ActiveMQConnectionFactory(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from: 
     SimpleProducer::run()  in main.o 
    "cms::CMSException::CMSException(cms::CMSException const&)", referenced from: 
     SimpleProducer::run()  in main.o 
    "typeinfo for cms::CMSException", referenced from: 
     GCC_except_table15 in main.o 
     GCC_except_table16 in main.o 
     SimpleProducer::run()  in main.o 
    "cms::CMSException::~CMSException()", referenced from: 
     SimpleProducer::run()  in main.o 
    "decaf::lang::Thread::getId()", referenced from: 
     SimpleProducer::run()  in main.o 
    "decaf::lang::Long::toString(long long)", referenced from: 
     SimpleProducer::run()  in main.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
make: *** [stackexchangeexample.app/Contents/MacOS/stackexchangeexample] Error 1 
make: Leaving directory `/Users/lostsoul/Dropbox/qt_cuda/stackexchangeexample-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK__Debug' 
20:54:22: The process "/usr/bin/make" exited with code 2. 
Error while building project stackexchangeexample (target: Desktop) 
When executing build step 'Make' 

ve eğer yardımcı oluyorsa, burada çalıştırdığım kod (yardım için kimseye yararlı olmayabilir)) Eğer o iş almak için bir sürü şeyler yüklemeniz gerekir, ancak her ihtimale karşı o yardımcı olduğu ing:

/* 
* Licensed to the Apache Software Foundation (ASF) under one or more 
* contributor license agreements. See the NOTICE file distributed with 
* this work for additional information regarding copyright ownership. 
* The ASF licenses this file to You under the Apache License, Version 2.0 
* (the "License"); you may not use this file except in compliance with 
* the License. You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

#include <decaf/lang/Thread.h> 
#include <decaf/lang/Runnable.h> 
#include <decaf/util/concurrent/CountDownLatch.h> 
#include <decaf/lang/Long.h> 
#include <decaf/util/Date.h> 
#include <activemq/core/ActiveMQConnectionFactory.h> 
#include <activemq/util/Config.h> 
#include <activemq/library/ActiveMQCPP.h> 
#include <cms/Connection.h> 
#include <cms/Session.h> 
#include <cms/TextMessage.h> 
#include <cms/BytesMessage.h> 
#include <cms/MapMessage.h> 
#include <cms/ExceptionListener.h> 
#include <cms/MessageListener.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 
#include <memory> 

using namespace activemq; 
using namespace activemq::core; 
using namespace decaf; 
using namespace decaf::lang; 
using namespace decaf::util; 
using namespace decaf::util::concurrent; 
using namespace cms; 
using namespace std; 

//////////////////////////////////////////////////////////////////////////////// 
class SimpleProducer : public Runnable { 
private: 

    Connection* connection; 
    Session* session; 
    Destination* destination; 
    MessageProducer* producer; 
    bool useTopic; 
    bool clientAck; 
    unsigned int numMessages; 
    std::string brokerURI; 
    std::string destURI; 

private: 

    SimpleProducer(const SimpleProducer&); 
    SimpleProducer& operator= (const SimpleProducer&); 

public: 

    SimpleProducer(const std::string& brokerURI, unsigned int numMessages, 
        const std::string& destURI, bool useTopic = false, bool clientAck = false) : 
     connection(NULL), 
     session(NULL), 
     destination(NULL), 
     producer(NULL), 
     useTopic(useTopic), 
     clientAck(clientAck), 
     numMessages(numMessages), 
     brokerURI(brokerURI), 
     destURI(destURI) { 
    } 

    virtual ~SimpleProducer(){ 
     cleanup(); 
    } 

    void close() { 
     this->cleanup(); 
    } 

    virtual void run() { 
     try { 

      // Create a ConnectionFactory 
      auto_ptr<ActiveMQConnectionFactory> connectionFactory(
       new ActiveMQConnectionFactory(brokerURI)); 

      // Create a Connection 
      try{ 
       connection = connectionFactory->createConnection(); 
       connection->start(); 
      } catch(CMSException& e) { 
       e.printStackTrace(); 
       throw e; 
      } 

      // Create a Session 
      if(clientAck) { 
       session = connection->createSession(Session::CLIENT_ACKNOWLEDGE); 
      } else { 
       session = connection->createSession(Session::AUTO_ACKNOWLEDGE); 
      } 

      // Create the destination (Topic or Queue) 
      if(useTopic) { 
       destination = session->createTopic(destURI); 
      } else { 
       destination = session->createQueue(destURI); 
      } 

      // Create a MessageProducer from the Session to the Topic or Queue 
      producer = session->createProducer(destination); 
      producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT); 

      // Create the Thread Id String 
      string threadIdStr = Long::toString(Thread::getId()); 

      // Create a messages 
      string text = (string)"Hello world! from thread " + threadIdStr; 

      for(unsigned int ix=0; ix<numMessages; ++ix){ 
       TextMessage* message = session->createTextMessage(text); 

       message->setIntProperty("Integer", ix); 

       // Tell the producer to send the message 
       printf("Sent message #%d from thread %s\n", ix+1, threadIdStr.c_str()); 
       producer->send(message); 

       delete message; 
      } 

     }catch (CMSException& e) { 
      e.printStackTrace(); 
     } 
    } 

private: 

    void cleanup(){ 

     // Destroy resources. 
     try{ 
      if(destination != NULL) delete destination; 
     }catch (CMSException& e) { e.printStackTrace(); } 
     destination = NULL; 

     try{ 
      if(producer != NULL) delete producer; 
     }catch (CMSException& e) { e.printStackTrace(); } 
     producer = NULL; 

     // Close open resources. 
     try{ 
      if(session != NULL) session->close(); 
      if(connection != NULL) connection->close(); 
     }catch (CMSException& e) { e.printStackTrace(); } 

     try{ 
      if(session != NULL) delete session; 
     }catch (CMSException& e) { e.printStackTrace(); } 
     session = NULL; 

     try{ 
      if(connection != NULL) delete connection; 
     }catch (CMSException& e) { e.printStackTrace(); } 
     connection = NULL; 
    } 
}; 

//////////////////////////////////////////////////////////////////////////////// 
int main(int argc AMQCPP_UNUSED, char* argv[] AMQCPP_UNUSED) { 

    activemq::library::ActiveMQCPP::initializeLibrary(); 

    std::cout << "=====================================================\n"; 
    std::cout << "Starting the example:" << std::endl; 
    std::cout << "-----------------------------------------------------\n"; 

    // Set the URI to point to the IPAddress of your broker. 
    // add any optional params to the url to enable things like 
    // tightMarshalling or tcp logging etc. See the CMS web site for 
    // a full list of configuration options. 
    // 
    // http://activemq.apache.org/cms/ 
    // 
    // Wire Format Options: 
    // ===================== 
    // Use either stomp or openwire, the default ports are different for each 
    // 
    // Examples: 
    // tcp://127.0.0.1:61616      default to openwire 
    // tcp://127.0.0.1:61616?wireFormat=openwire same as above 
    // tcp://127.0.0.1:61613?wireFormat=stomp  use stomp instead 
    // 
    std::string brokerURI = 
     "failover://(tcp://127.0.0.1:61616" 
//  "?wireFormat=openwire" 
//  "&connection.useAsyncSend=true" 
//  "&transport.commandTracingEnabled=true" 
//  "&transport.tcpTracingEnabled=true" 
//  "&wireFormat.tightEncodingEnabled=true" 
     ")"; 

    //============================================================ 
    // Total number of messages for this producer to send. 
    //============================================================ 
    unsigned int numMessages = 2000; 

    //============================================================ 
    // This is the Destination Name and URI options. Use this to 
    // customize where the Producer produces, to have the producer 
    // use a topic or queue set the 'useTopics' flag. 
    //============================================================ 
    std::string destURI = "TEST.FOO"; 

    //============================================================ 
    // set to true to use topics instead of queues 
    // Note in the code above that this causes createTopic or 
    // createQueue to be used in the producer. 
    //============================================================ 
    bool useTopics = false; 

    // Create the producer and run it. 
    SimpleProducer producer(brokerURI, numMessages, destURI, useTopics); 

    // Publish the given number of Messages 
    producer.run(); 

    // Before exiting we ensure that all CMS resources are closed. 
    producer.close(); 

    std::cout << "-----------------------------------------------------\n"; 
    std::cout << "Finished with the example." << std::endl; 
    std::cout << "=====================================================\n"; 

    activemq::library::ActiveMQCPP::shutdownLibrary(); 
} 

Sadece boş C++ projesini yarattı, kütüphaneler için bir yol içerecek şekilde .pro dosyayı modifiye ve daha sonra kodu main.cpp'ye kopyalayın/yapıştırın. Bunun ne olduğu hakkında bir fikrin var mı? ve nasıl önleyebilirim?

cevap

4

kitaplık yollarını; INCLUDEPATH'u yeni değerlerle tanımlayın, ancak karşılık gelen bir LIBPATH veya LIBRARYPATH veya kitaplıklar için eşdeğerli değişken adı ne olursa olsun eklemeyin. Belirli kütüphaneler için ilgili -l library parametrelerine de ihtiyacınız olmayacak mı?

+0

Özür dilerim, C++ ve QT'ye daha yeni yaşıyorum, yukarıdaki kodda yer aldığım 20 tane kütüphaneyi dahil etmeyi planlıyorsam, bunları tek tek bildirmeden yapmanın bir yolu var mı? İçerdiğim kütüphaneler için dosya bulunamadığı zaman bahsettiğiniz seçeneği gördüm, böylece ana klasörü almayı denedim, böylece hepsini aldım. Tamamen anladığımdan emin değilim, ama kullanmayı planladığımdan özellikle bahsedeyim mi? Üzgünüm cevabını tamamen yanlış yorumlamış olsaydım. – Lostsoul

+0

Hala bununla uğraşıyorum. Ben hangi dosyayı arıyor emin değilim, çünkü ben sadece * .h dosyaları ama ben pro dosyasını sağ tıklayın ve kütüphane ekle seçin istediğim klasörlerde istediği gibi emin değilim dosya – Lostsoul

+1

Anladım! Pro dosyasını sağ tıklayıp kütüphaneye ekledim, sistem kütüphanesine gittim ve/usr/local/lib dizinine işaret ettiğim gerçek .h dosyalarının yolunu eklemek yerine. Bu, qt yaratıcısının .pro dosyasına eklemesini sağladı ve şu an oluşturuldu: unix | win32: LIBS + = -lactivemq-cpp – Lostsoul