如何使用cmake将编译器命令行args放在特定的地方

时间:2013-01-15 21:17:52

标签: g++ cmake gnu ld

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

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-archiveapp之前添加models,然后在它们之后添加-Wl,--no-whole-archive(这样标准库导入就不会由共享库导出。)

在CMake中最简单的方法是什么?


添加:所以我想尽可能多地使用标准的cmake内容,这样我就不需要为Windows版本做任何额外的工作,因为CMake会删除编译器正在构建的平台上不支持的定义。

2 个答案:

答案 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首先将它们构建为对象库,然后将它们链接到相应的共享库和静态库中。