1

いくつかのオプションのタスクのために、他のライブラリ ( ColPack ) にリンクする必要がある数学ライブラリ ( ADOL-C ) があります。

Linux では問題なくコンパイルでき、Windows では ADOl-C または ColPack の両方を単独でコンパイルできますが、Windows で ColPack を使用して ADOL-C をコンパイルしようとすると (MinGW 32、ld 2.22)、次の問題が発生します。

$ make
Making all in ADOL-C
make[1]: Entering directory `/c/tests/ADOL-C-2.3.0/ADOL-C'
[...]
  CC     int_reverse_s.lo
  CC     int_reverse_t.lo
  CXXLD  libadolc.la

*** Warning: This system can not link to static lib archive /usr/lib/libColPack.
la.
*** I have the capability to make that library automatically link in when
*** you link to this library.  But I can only do this if you have a
*** shared version of the library, which you do not appear to have.
Creating library file: .libs/libadolc.dll.a
sparse/.libs/libsparse.a(sparsedrivers.o): In function `generate_seed_jac':
c:\tests\ADOL-C-2.3.0\ADOL-C\src\sparse/sparsedrivers.cpp:119: undefined referen
ce to `ColPack::BipartiteGraphPartialColoringInterface::BipartiteGraphPartialCol
oringInterface(int, ...)'

[...]
collect2: ld returned 1 exit status
make[5]: *** [libadolc.la] Error 1
make[5]: Leaving directory `/c/tests/ADOL-C-2.3.0/ADOL-C/src'
make[4]: *** [all-recursive] Error 1

ColPack を --enable-shared で構成したとしても、MinGW のように動的ライブラリを提供することはできません。コンパイルから実際に共有ライブラリを取得することはなく、libColPack.[a|la|lai] と ColPack.exe のみです。 .

ヒントはありますか?

4

1 に答える 1

2

問題を解決するまで、もう少し時間がかかりました。

Colpack-1.0.8.tar.gz をダウンロードし、以下の環境でテスト

Msys/mingw 4.7.0。

あなたが言ったように、それを使用して共有ライブラリを作成することはできません。しばらくして、より複雑な解決策を見つけました。この基礎から、私はより短い方法を見つけました。

短い解決策:

構成を開く

行番号_ _ _ _ _ _ _ _ _ __ _ _ _ _ _ __に変更

7660        enable_dlopen=no      set it to yes
7663        enable_win32_dll=no   set it to yes
7673        enable_shared=no      set it to yes
7710        enable_static=yes     set it to no
7717        enable_static=yes     set it to no  
8721        enable_shared_with_static_runtimes=no      set it to yes
11797       enable_shared_with_static_runtimes_CXX=no  set it to yes

保存して実行

./configure --disable-static --enable-shared

libtoolを開く

行番号_ _ _ _ _ _ _ _ _ __ _ _ _ _ _ __に変更

5547        allow_undefined=yes   set it to no
5550        allow_undefined=yes   set it to no

保存して実行

make clean
make

.libディレクトリに次のファイルがあるはずです。

ColPack.exe      .. 30.08.2012
libColPack.la    .. 30.08.2012
libColPack.lai   .. 30.08.2012
libColPack-0.dll .. 30.08.2012
libColPack.dll.a .. 30.08.2012

libColPack-0.dllからの取り出し

Export Table:
  Name:                          libColPack-0.dll
  Time Date Stamp:               0x503F3A43 (30.08.2012 11:02:43)
  Version:                       0.00
  Ordinal Base:                  1
  Number of Functions:           883
  Number of Names:               883

  Ordinal   Entry Point   Name
        1   0x000012FC    _Z10createArgsiPPKcRSt6vectorISsSaISsEE
        2   0x00011034    _Z10toFileBiPCSsSsSt6vectorISsSaISsEES1_St3mapISsbSt4lessISsESaISt4pairIKSsbEEE
        3   0x00001FB0    _Z11mm_is_validPc
        ........

libColPack.laからの抜粋

# libColPack.la - a libtool library file
# Generated by libtool (GNU libtool) 2.4 
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='libColPack-0.dll'

# Names of this library.
library_names='libColPack.dll.a'

......

それが役立つことを願っています!

ノート:

「make install」をテストしていません!

静的と動的の両方を持つには:

libColPack.la、libColPack.lai、libColPack.dll.a を別のフォルダに移動します。それらが必要であり、それらは上書きされます。ディレクトリ レベルの上位にあるファイル libColPack.la を削除します。

libtool ファイルを元の状態 (2 行) に戻します。

「メイク」を実行

新しい libColPack.a が作成されます

libColPack.dll.a を .libs に戻します。

以前に移動した 2 つのファイルの内容を新しい libColPack.la (.lai) とマージします。

更新された libColPack.la もディレクトリ レベルの上位にコピーします。

新しいミックスダウン ファイル: libColPack.la

# libColPack.la - a libtool library file
# Generated by libtool (GNU libtool) 2.4 
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='libColPack-0.dll'

# Names of this library.
library_names='libColPack.dll.a'

....

# The name of the static archive.
old_library='libColPack.a'
....

このトリックを使用すると、静的ライブラリと動的ライブラリの両方を使用できます。

于 2012-08-30T11:33:47.580 に答える