6

数学ライブラリに依存する静的ライブラリ mylib があります。

最初に mylib を math にリンクしてから実行可能ファイルにリンクすると、次のように動作します。

add_executable(myapp main.c)
target_link_libraries(mylib m)
target_link_libraries(myapp mylib)

しかし、実行可能ファイルと直接リンクすると、gcc を使用すると失敗します (clang を使用すると動作します!)

add_executable(myapp main.c)
target_link_libraries(myapp m mylib)

なぜこれが違いを生むのですか?
とにかくライブラリをリンクすることはできないと思いましたか?

4

2 に答える 2

6

cmake を使用する場合、target_link_libraries何かをリンクするという意味ではありません。むしろ、targetalibraryと type/action のa の間に依存関係を作成しますlink

最初の例の実際のビルド行は、次のような結果になると思います。

gcc -o myapp myapp.o -lmylib -lm

そして2つ目

gcc -o myapp myapp.o -lm -lmylib

. mylib2 番目の例への参照がある場合m(リンクしない可能性があります)。

リンクプロセスのコマンドラインを実行make VERBOSE=1して調査し、何が起こっているのかを本当に理解してください。clang のリンカはおそらくインテリジェントであり、すべての呼び出しがリンクされるのを待ってから、リンク プロセス中に実際にライブラリを削除します。

于 2013-03-03T10:48:06.183 に答える
0

使用target_link_librariesする場合は、リンクされたライブラリを指定する順序が重要です。

これは、gcc を使用している場合には機能しません (少なくとも v4.6.3 では):

target_link_libraries(myapp m mylib)

これが機能している間:

target_link_libraries(myapp mylib m)

したがって、mylib が依存するすべてのライブラリは、mylib の後に配置する必要があります。

実際のリンカー呼び出しを追跡するmake VERBOSE=1と、壊れた例でこれが見つかります。

gcc main.c.o  -o luatest -rdynamic -lm mylib.a

そして、これは作業用のものです:

gcc main.c.o  -o luatest -rdynamic mylib.a -lm

まったく同じパラメーターで clang を呼び出すと、どちらの場合でも機能します。

したがって、@ PatrickB は正しいようです。

clang のリンカはおそらくインテリジェントであり、すべての呼び出しがリンクされるのを待ってから、リンク プロセス中に実際にライブラリを削除します。

于 2013-03-03T20:03:44.937 に答える