0

私は C++ を初めて使用し、最近言語を紹介するクラスを受講したので、構文の基本は理解していますが、外部ライブラリを使用してコードに接続する方法については説明がありませんでした。

私は線形プログラムを解くためにCLP COINライブラリを使用しようとしています... http://www.coin-or.org/Clp/userguide/clpuserguide.html#id4766717

私がそこで読んだことから、ソースをダウンロードするのではなく、プリコンパイルされたバイナリ ライブラリを使用することを提案しました。Windows 7 プラットフォームを使用しているためです。

私は単に Hello World と同等のものを動作させようとしています。テスト用に提供されたサンプルコードは次のとおりです...

* Copyright (C) 2004, International Business Machines Corporation 
   and others.  All Rights Reserved.

   This sample program is designed to illustrate programming 
   techniques using CoinLP, has not been thoroughly tested
   and comes without any warranty whatsoever.

   You may copy, modify and distribute this sample program without 
   any restrictions whatsoever and without any payment to anyone.
*/

/* This shows how to provide a simple picture of a matrix.
   The default matrix will print Hello World
*/

#include "ClpSimplex.hpp"

int main (int argc, const char *argv[])
{
  ClpSimplex  model;
  int status;
  // Keep names
  if (argc<2) {
    status=model.readMps("hello.mps",true);
  } else {
    status=model.readMps(argv[1],true);
  }
  if (status)
    exit(10);

  int numberColumns = model.numberColumns();
  int numberRows = model.numberRows();

  if (numberColumns>80||numberRows>80) {
    printf("model too large\n");
    exit(11);
  }
  printf("This prints x wherever a non-zero elemnt exists in matrix\n\n\n");

  char x[81];

  int iRow;
  // get row copy
  CoinPackedMatrix rowCopy = *model.matrix();
  rowCopy.reverseOrdering();
  const int * column = rowCopy.getIndices();
  const int * rowLength = rowCopy.getVectorLengths();
  const CoinBigIndex * rowStart = rowCopy.getVectorStarts();

  x[numberColumns]='\0';
  for (iRow=0;iRow<numberRows;iRow++) {
    memset(x,' ',numberColumns);
    for (int k=rowStart[iRow];k<rowStart[iRow]+rowLength[iRow];k++) {
      int iColumn = column[k];
      x[iColumn]='x';
    }
    printf("%s\n",x);
  }
  printf("\n\n");
  return 0;
}    

Visual Studio でインクルード ディレクトリと Lib ディレクトリをプロジェクトに関連付けましたが、ビルドしようとすると、次のような多くのリンカー エラーが発生します。

Simplex(void)" (??1ClpSimplex@@QAE@XZ) referenced in function _main
1>hello.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall CoinPackedMatrix::~CoinPackedMatrix(void)" (??1CoinPackedMatrix@@UAE@XZ) referenced in function _main
1>hello.obj : error LNK2019: unresolved external symbol "public: void __thiscall CoinPackedMatrix::reverseOrdering(void)" (?reverseOrdering@CoinPackedMatrix@@QAEXXZ) referenced in function _main
1>hello.obj : error LNK2019: unresolved external symbol "public: __thiscall CoinPackedMatrix::CoinPackedMatrix(class CoinPackedMatrix const &)" (??0CoinPackedMatrix@@QAE@ABV0@@Z) referenced in function _main
1>hello.obj : error LNK2019: unresolved external symbol "public: int __thiscall ClpSimplex::readMps(char const *,bool,bool)" (?readMps@ClpSimplex@@QAEHPBD_N1@Z) referenced in function _main
1>hello.obj : error LNK2019: unresolved external symbol "public: __thiscall ClpSimplex::ClpSimplex(bool)" (??0ClpSimplex@@QAE@_N@Z) referenced in function _main

私のコースはリンカの問題ではなく、コード構文に関連するデバッグのみを扱っているため、初心者として、この問題を解決する方法についてはわかりません。

ヒントや他のスレッドへのリンクは非常に役立ちます。私は一日中グーグルをしていましたが、途方に暮れています...

4

1 に答える 1

0

Libディレクトリをプロジェクトに関連付けるために何をしたか正確にはわかりませんが、これらが完了していることを確認する必要があります(最初のものは見過ごされがちです):

  • ライブラリ ファイル名をプロジェクトの "Linker/Input/Additional Dependencies" プロパティに追加する必要があります。

  • 上記のプロパティに適切なパスを指定するか、ファイル名だけを指定するかによって、ライブラリの場所をプロジェクトの「リンカー/一般/追加ライブラリ ディレクトリ」プロパティに配置する必要がある場合もあります。これはおそらくあなたがすでに行ったことです。


アップデート:

投稿した dumpbin の出力には、次のエントリが表示されます。

4C3 0000AE4A SECT98 notype () External | ?readMps@ClpSimplex@@QEAAHPEBD_N 1@Z (public: int __cdecl ClpSimplex::readMps(char const *,bool,bool)) 

エラー メッセージには、次のように表示されます。

1>hello.obj : error LNK2019: unresolved external symbol "public: int __thiscall ClpSimplex::readMps(char const *,bool,bool)" (?readMps@ClpSimplex@@QAEHPBD_N1@Z) referenced in function _main

2 つのメッセージからデマングルされた名前を比較します。

public: int __cdecl ClpSimplex::readMps(char const *,bool,bool)     // what's in the .lib
public: int __thiscall ClpSimplex::readMps(char const *,bool,bool)  // what hello.obj is asking for

2 つの呼び出し規約が異なることがわかります。coin-or.org の Web サイトを見ると、ライブラリは VC 2005 でビルドされているようです。Microsoft コンパイラの場合、ライブラリは常に異なるコンパイラ バージョンで使用できるとは限りません。このビルド済みライブラリを使用する場合は、VC 2005 を使用することをお勧めします (無料の Express バージョンはhttp://go.microsoft.com/fwlink/?linkid=57034から入手できます)。

FWIW、いくつかの MS コンパイラで例をコンパイルしてみましたが、次の結果が得られました (ビルドのみ - プログラムを実行しようとすると、一部のファイルが見つからないというエラーが表示されます:

  • 動作: VC 2005 および VC 2008
  • 失敗: VC 6 および VC2010
于 2012-04-18T01:42:59.647 に答える