我剛剛開始使用C++,並且正在學習如何將QT創建者用作IDE,所以我懷疑這可能非常簡單,但我可能會錯過某些東西。我安裝了apollo MQ並安裝了apache CMS(C++ messaging service),這樣我就可以用C++與服務器交互了。問題是,我不知道我在做什麼:-)(還),我不知道爲什麼我在使用示例時遇到上述錯誤。QT創建者中架構x86_64的未定義符號
我非常確定這些例子很好,因爲它們包含在源代碼示例文件夾中,因此它讓我懷疑項目的配置不正確(因爲它是我真正有影響的唯一方法)。
這裏的.pro文件:
TEMPLATE = app
CONFIG += console
CONFIG -= qt
SOURCES += main.cpp
INCLUDEPATH += /usr/local/include/activemq-cpp-3.4.2/
INCLUDEPATH += /opt/local/lib/
這裏就是我指向文件夾的內容(我想要的文件的所有子目錄中有):
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
這裏的我得到的錯誤:
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'
如果有幫助,這裏是我運行的代碼(它可能對任何人都沒用荷蘭國際集團,因爲你需要安裝一堆東西得到它的工作,但爲了以防萬一它有助於):
/*
* 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();
}
我剛剛創建了一個空的C++項目,修改.pro文件,包括到庫的路徑然後將代碼複製/粘貼到main.cpp中。任何想法是什麼導致這個?以及我如何防止它?
對不起,我真的對C++新手而對QT更新,如果我打算在上面的代碼中包含20個左右的庫,是否有辦法在不單獨聲明它們的情況下這樣做?我看到了你提到的選項,當我爲包含的庫找到'file not found'時,所以我嘗試獲取父文件夾,這樣就可以得到它們。我不確定自己完全理解,但是我應該特別提一下我打算使用的那些?對不起,如果我完全誤解了你的答案。 – Lostsoul
我還在爲此而苦苦掙扎。我似乎無法破解它,因爲我不知道它在找什麼文件,在我指向的文件夾中只有* .h文件,但是當我右鍵單擊專業文件並選擇添加庫時,它似乎想要一個文件 – Lostsoul
我懂了!我右鍵單擊pro文件並添加到庫中,進入系統庫,而不是添加指向/ usr/local/lib目錄中實際.h文件的路徑。這導致qt創建者將其添加到我的.pro文件,它似乎現在構建:unix | win32:LIBS + = -lactivemq-cpp – Lostsoul