9

所以我正在用两个静态库构建一个共享库。

这个答案说这样做的方法是-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 东西,这样我就不必为 windows 构建做任何额外的工作,因为 CMake 友好地删除了平台上不支持的编译器定义。建成。

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 回答