3

コンパイルの基本的なエラーがあります。

一言で言えば私の主なものは次のとおりです。

main.cpp

#include "sendArrayObj.h"
sendArrayObj* sendqueue;

void foo(){
    int i = sendqueue->count()
}

int main(){
    int i =10;
    sendqueue = new sendArrayObj(i);
    foo();
}

sendArrayObj.h

using namespace std;
#include <string.h>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <unistd.h>


class sendArrayObj{
private:
    int size,toEnqueue,toDequeue,lastDequeuedInd;
    unsigned long long totalEnqueued,totalDequeued;

public:
    char** arr;
    int* lengths;
    sendArrayObj(int size);
    void enqueue(string str);
    char* dequeue();
    int count();
    int getDequeuedSize();

};

sendArrayObj.cpp

#include "sendArrayObj.h"

pthread_mutex_t mutex_requestsqueue = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex_count = PTHREAD_MUTEX_INITIALIZER;


sendArrayObj::sendArrayObj( int size){
this->size = size;
toEnqueue = 0;
toDequeue = 0;
totalEnqueued = 0;
totalDequeued = 0;
lastDequeuedInd = -1;
arr = (char**)malloc(size*sizeof(char*));//alloc number of pointers
lengths = (int*)malloc(size*sizeof(int));//alloc number of lengths
}

void sendArrayObj::enqueue(std::string str){
int strSize = str.size();
pthread_mutex_lock( &mutex_requestsqueue );
if (arr[toEnqueue]!= NULL){
    free(arr[toEnqueue]);
    toDequeue = (toDequeue+1)%size;
    totalDequeued++;
}
arr[toEnqueue] = (char*)malloc(strSize);
memcpy(arr[toEnqueue],(char*)str.c_str(),strSize);
lengths[toEnqueue] = strSize;
toEnqueue = (toEnqueue+1)%size;
totalEnqueued++;
pthread_mutex_unlock( &mutex_requestsqueue );
}



char* sendArrayObj::dequeue(){
pthread_mutex_lock( &mutex_requestsqueue );
//allocate memory to the ans 
//char* ans = new char[lengths[toDequeue]];
char* ans = arr[toDequeue];
lastDequeuedInd = lengths[toDequeue];
//memcpy(ans,arr[toDequeue],lengths[toDequeue]);
//if (arr[toDequeue]!=NULL){
    //delete[] arr[toDequeue];
arr[toDequeue] = NULL;
//}
toDequeue = (toDequeue+1)%size;
totalDequeued++;
//printf("totalDequeued is %d\n",totalDequeued);
pthread_mutex_unlock( &mutex_requestsqueue );
return ans;

}



int sendArrayObj::count(){
pthread_mutex_lock( &mutex_count );
int ans = totalEnqueued-totalDequeued; 
pthread_mutex_unlock( &mutex_count );
//printf("count is %d\n",ans);
return ans;
}

int sendArrayObj::getDequeuedSize(){    
return lastDequeuedInd;
}

私のコンパイルバッチは

g++ -g -pthread utils/hregex.cpp ExcludeFields.cpp utils/sha1.cpp utils/utils.cpp utils/base64.cpp utils/xmlhelper.cpp utils/messagehelper.cpp utils/safe_queue.cpp utils/parser.cpp utils/default_config.cpp ExcludesParameters.cpp main_process_helper.cpp main.cpp -Iutils -Ibusiness_objects -o telepath_sniff

ファイルは「utils」フォルダーにあります

なぜ私がそれを手に入れているのか分かりますか??

ありがとう

4

2 に答える 2

4

どのオブジェクト ファイルをアプリケーションにリンクするかをリンカに指示する必要があります。

編集:

あなたは次のコマンドを投稿しました。読みやすさは私が微調整しました。

g++ -g -pthread 
utils/hregex.cpp \
ExcludeFields.cpp \
utils/sha1.cpp \
utils/utils.cpp \
utils/base64.cpp \
utils/xmlhelper.cpp \
utils/messagehelper.cpp \
utils/safe_queue.cpp \
utils/parser.cpp \
utils/default_config.cpp \
ExcludesParameters.cpp \
main_process_helper.cpp \
main.cpp -Iutils -Ibusiness_objects -o telepath_sniff

GNU ツールでは、依存関係はそれに依存するもののに置きます。

たとえば、 にmain.cpp依存する場合foobar.cpp、次のように記述します。

g++ main.cpp foobar.cpp

リンカーは をリンクしようとしmain.cpp、後で解決する必要がある参照のリストを保持するためです。あなたはそれを間違って注文しました。

そして最後に、あなたは完全に欠けていますsendArrayObj.cpp

そう、

  • 依存するものを最初に置き、依存するものをその後ろに置く
  • ビルド スクリプトコマンドに追加sendArrayObj.cppする

補足:一般的には

  • インクルードガードを使用する
  • グローバル変数を避ける
  • 手動のメモリ管理を避ける
  • 書き込み可能なメンバー変数を公開しない
  • コピーのセマンティクスを適切に定義するか、コピー全体を禁止するかのいずれか
  • C ヘッダーを使用しない (例: use cstdio、 not stdio.h)
  • constクラスのインスタンスの監視可能な状態を変更することが想定されていない場合は、メンバー関数を作成します
  • using namespaceヘッダファイルに入れない
  • 動的に割り当てられた配列のようなstd::list、またはそれよりも標準ライブラリ コンテナーを優先するstd::vector
  • メモリを管理するクラスのデストラクタを書く
  • メモリ解放
  • 一貫したインデント スキームを使用する
  • 必要のないヘッダーを含めないでください。これには時間がかかり、したがってお金がかかります
  • ビルド システムを使用する (makefile、IDE プロジェクト ファイル、cmake、Scons など)
  • あなたが初心者であるトピックに関する優れた入門書を入手する
  • 優れた入門書を読んでいない場合は、それほど大きなプロジェクトを作成しないでください。これは、C++ に 2 重に 3に当てはまります。
于 2012-12-19T15:01:02.077 に答える
1

sendArrayObj.cppコンパイルコマンドラインから欠落しているようです。これを追加すると、この特定の問題が解決するはずです。ただし、後続のコンパイルを高速化するために、異なるコンパイルユニットのオブジェクトファイルを個別にビルドすることを検討してください(変更されたコンパイルユニットのみを再コンパイルする必要があります)。

于 2012-12-19T15:12:29.090 に答える