0

静的ライブラリを使用しようとしていますが、参照を追加してプロジェクトにディレクトリをインクルードすると、ヘッダーファイルのみを含む奇妙なコンパイラエラーが発生します。

静的ライブラリプロジェクトは正常にビルドされます。エラーがどこにあるのかわかりませんが、静的ライブラリのファイルにある可能性があります。

静的ライブラリファイルは次のとおりです。

ヘッダ:

#ifndef UTIL_H_
#define UTIL_H_

#include <string>
#include <iostream>
#include <vector>
#include <stdlib.h>

namespace Kaczmarz {

class Util {
public:
    Util();
    static void split(std::vector<std::string> &tokens, const std::string &text, char sep);
    static double random(int rangeMin,int rangeMax);

    virtual ~Util();
};

} 
#endif

cpp:

#include "Util.h"

namespace Kaczmarz {

Util::Util() {
    // TODO Auto-generated constructor stub
}

void Util::split(std::vector<std::string> &tokens, const std::string &text, char sep) {
    unsigned int start = 0, end = 0;
    while ((end = text.find(sep, start)) != std::string::npos) {
        tokens.push_back(text.substr(start, end - start));
        start = end + 1;
    }
    tokens.push_back(text.substr(start));
}

double Util::random(int rangeMin,int rangeMax){
    return (double) static_cast<double>( rand() ) * rangeMax / static_cast<double>( RAND_MAX ) + rangeMin;
}


Util::~Util() {
    // TODO Auto-generated destructor stub
}

}

静的ライブラリを使用しようとするファイル:

#include <iostream>

using namespace std;
//using namespace Kaczmarz;

int main(){
    cout << "Started.." << endl;
    return 0;
}

ライブラリからまだ関数を呼び出していないことに注意してください。

私が得たエラーは次のとおりです。

1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(21): error C2143: syntax error : missing ';' before '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(21): error C2433: 'basic_string' : 'inline' not permitted on data declarations
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(21): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(21): error C2988: unrecognizable template declaration/definition
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(21): error C2059: syntax error : '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(38): error C2143: syntax error : missing ';' before '{'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(38): error C2447: '{' : missing function header (old-style formal list?)
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(49): error C2143: syntax error : missing ';' before '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(49): error C2433: 'basic_string' : 'inline' not permitted on data declarations
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(49): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(49): error C2086: 'int std::basic_string' : redefinition
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(21) : see declaration of 'std::basic_string'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(49): error C2988: unrecognizable template declaration/definition
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(49): error C2059: syntax error : '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(66): error C2143: syntax error : missing ';' before '{'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(66): error C2447: '{' : missing function header (old-style formal list?)
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(77): error C2143: syntax error : missing ';' before '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(77): error C2433: 'basic_string' : 'inline' not permitted on data declarations
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(77): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(77): error C2086: 'int std::basic_string' : redefinition
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(21) : see declaration of 'std::basic_string'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(77): error C2988: unrecognizable template declaration/definition
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(77): error C2059: syntax error : '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(94): error C2143: syntax error : missing ';' before '{'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(94): error C2447: '{' : missing function header (old-style formal list?)
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(101): error C2143: syntax error : missing ';' before '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(101): error C2433: 'basic_string' : 'inline' not permitted on data declarations
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(101): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(101): error C2086: 'int std::basic_string' : redefinition
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(21) : see declaration of 'std::basic_string'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(101): error C2988: unrecognizable template declaration/definition
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(101): error C2059: syntax error : '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(114): error C2143: syntax error : missing ';' before '{'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(114): error C2447: '{' : missing function header (old-style formal list?)
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(125): error C2143: syntax error : missing ';' before '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(125): error C2433: 'basic_string' : 'inline' not permitted on data declarations
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(125): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(125): error C2086: 'int std::basic_string' : redefinition
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(21) : see declaration of 'std::basic_string'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(125): error C2988: unrecognizable template declaration/definition
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(125): error C2059: syntax error : '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(138): error C2143: syntax error : missing ';' before '{'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(138): error C2447: '{' : missing function header (old-style formal list?)
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(145): error C2143: syntax error : missing ';' before '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(145): error C2433: 'basic_string' : 'inline' not permitted on data declarations
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(145): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(145): error C2086: 'int std::basic_string' : redefinition
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(21) : see declaration of 'std::basic_string'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(145): error C2988: unrecognizable template declaration/definition
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(145): error C2059: syntax error : '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(158): error C2143: syntax error : missing ';' before '{'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(158): error C2447: '{' : missing function header (old-style formal list?)
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(166): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(166): error C2143: syntax error : missing ',' before '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(170): error C2803: 'operator ==' must have at least one formal parameter of class type
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(170): error C2805: binary 'operator ==' has too few parameters
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(177): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(177): error C2143: syntax error : missing ',' before '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(180): error C2803: 'operator ==' must have at least one formal parameter of class type
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(186): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(186): error C2143: syntax error : missing ',' before '<'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(190): fatal error C1903: unable to recover from previous error(s); stopping compilation

エラーはstd文字列クラスに言及していることに注意してください。

4

2 に答える 2

4

クリスマスの時期なので、MSVS を使用していることがわかりました。ライブラリを試すために行った手順は次のとおりです。

ステップ 1 : XmasLib と呼ばれる新しい Win32 プロジェクトを含む XmasTest と呼ばれる新しいソリューションを作成しました。

ステップ 2 : そのプロジェクトにソース ファイルを追加しました。単純な例に適した変更です。using namespace std;ヘッダーファイルにその邪悪な行さえ入れました。

Util.h

#ifndef UTIL_H_
#define UTIL_H_

#include <string>
#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

namespace Kaczmarz {

class Util {
public:
    Util();
    static void print();

    virtual ~Util();
};

} /* namespace Kaczmarz */
#endif

ユーティリティ.cpp

#include "Util.h"
using namespace std;

namespace Kaczmarz {

Util::Util() {
    // TODO Auto-generated constructor stub

}

void Util::print() {
    cout << "Util::print() works! yay!" << endl;
}

Util::~Util() {
}

} /* namespace Kaczmarz */

ステップ 3 : 次のコードを含む XmasLibTestApp という新しい Win32 コンソール アプリケーションを作成しました。

#include <iostream>

#include "../XmasLib/Util.h"

using namespace std;
using namespace Kaczmarz;

int main(){
    Util u;
    u.print();
    return 0;
}

ステップ 4 : これらは 1 つのソリューション内の 2 つのプロジェクトであるため、次の方法で依存関係を処理しました。

  1. リンカー -> 一般 -> 追加のライブラリ ディレクトリ: $(OutDir)
  2. Linker->Input->Additional Dependencies: XmasLib.lib
  3. ソリューション プロパティ -> ProjectDependencies: アプリは lib に依存します

ステップ 5 : ソリューションをビルドしてアプリを実行します。出力:Util::print() works! yay!

以上です。話の終わり、すべてが機能し、開発者は自分の IDE を喜んでいます。

ハッピークリスマス!:D


PS: 一見の価値がある質問:
なぜ「名前空間 std を使用する」ことは悪い習慣と見なされるのですか?
「using namespace std;」と宣言する必要があるのは何ですか?
名前空間 std を使用して配置する場所。

于 2012-12-21T15:33:29.697 に答える
0

わかりました、このコンパイル エラーの原因が見つかりました。

「追加のインクルード ディレクトリ」(vs 2012) には、「Util」クラスをインポートする別の .cpp/.h ファイルがありました。

このファイルをディレクトリから削除したところ、今回はエラーなしで正常にコンパイルされました。このファイルはプロジェクトに存在しなかったことに注意してください(除外しました)が、「追加のインクルードディレクトリ」がプロジェクト内で何らかの形でリンクしているようです。

回答してくださった皆様、本当にありがとうございました。

于 2012-12-25T23:01:45.393 に答える