所以我正在用两个静态库构建一个共享库。
This answer说这样做的方法是在我的静态库之前插入-Wl,--whole-archive
,然后在-Wl,--no-whole-archive
之后插入。{/ p>
所以我目前在共享库中的cmake中有:
add_library(wittyPlus SHARED empty.cpp)
target_link_libraries(wittyPlus
${wtdbosqlite}
${WT_LIBRARIES}
${DB_LIBRARIES}
${Boost_LIBRARIES}
app models
)
所以我需要的是它在-Wl,--whole-archive
和app
之前添加models
,然后在它们之后添加-Wl,--no-whole-archive
(这样标准库导入就不会由共享库导出。)
在CMake中最简单的方法是什么?
添加:所以我想尽可能多地使用标准的cmake内容,这样我就不需要为Windows版本做任何额外的工作,因为CMake会删除编译器正在构建的平台上不支持的定义。
答案 0 :(得分:16)
所以根据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: how create a single shared library from all static libraries of subprojects?
答案 1 :(得分:0)
如果您自己构建静态库,则可以使用以下方法:https://stackoverflow.com/a/29824424/4069571首先将它们构建为对象库,然后将它们链接到相应的共享库和静态库中。