9

そこで、2つの静的ライブラリから共有ライブラリを構築しています。

この回答-Wl,--whole-archiveは、静的ライブラリの前、後に挿入する方法を示してい-Wl,--no-whole-archiveます。

したがって、共有ライブラリ用に現在cmakeにあるのは次のとおりです。

add_library(wittyPlus SHARED empty.cpp)
target_link_libraries(wittyPlus 
    ${wtdbosqlite}
    ${WT_LIBRARIES}
    ${DB_LIBRARIES}
    ${Boost_LIBRARIES}
    app models
)

-Wl,--whole-archiveしたがって、必要なのは、前appmodels後を追加することです-Wl,--no-whole-archive(これにより、標準ライブラリのインポートが共有ライブラリによってエクスポートされなくなります)。

CMakeでこれを行う最も簡単な方法は何ですか?


追加:それで、私は可能な限り標準のcmakeのものを使用したいと思います。そうすれば、CMakeはプラットフォームでサポートされていないコンパイラ定義を親切に削除するので、Windowsビルドのために余分な作業を行う必要はありません。構築されました。

4

2 に答える 2

20

わかりました、思ったよりずっと簡単でした。

したがって、cmake docsによると:

「-」で始まり、「-l」または「-framework」ではない項目名は、リンカー フラグとして扱われます。

したがって、修正は次のとおりでした。

add_library(wittyPlus SHARED empty.cpp)
target_link_libraries(wittyPlus 
    ${wtdbosqlite}
    ${WT_LIBRARIES}
    ${DB_LIBRARIES}
    ${Boost_LIBRARIES}
    "-Wl,--whole-archive"
    app models
    "-Wl,--no-whole-archive"
)

Windowsで動作するかどうかはわかりませんが、cmakeは非常に賢いので、動作することを期待しています。

objdump で結果を見ると、エクスポートに多くのブーストが含まれているように見えるので、何か間違っている可能性があります。

objdump -C -t wittyPlus/libwittyPlus.so | grep -i boost

しかし、それに対してリンクする必要があるものがあるので、それは一歩前進です.

他の回答は引き続き歓迎します。基本的に私がやろうとしていることは、この質問と同じです:

CMake:サブプロジェクトのすべての静的ライブラリから単一の共有ライブラリを作成する方法は?

于 2013-01-15T21:43:24.577 に答える
1

静的ライブラリを自分で構築する場合は、https ://stackoverflow.com/a/29824424/4069571 というアプローチを使用できます。つまり、最初にオブジェクト ライブラリとして構築してから、それぞれの共有ライブラリと静的ライブラリにリンクします。

于 2016-12-19T19:02:04.867 に答える