【问题标题】:how to put compiler command line args in specific places using cmake如何使用 cmake 将编译器命令行参数放在特定位置
【发布时间】:2012-12-30 02:30:54
【问题描述】:

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

This answer 说这样做的方法是在我的静态库之前插入 -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
)

所以我需要在appmodels 之前添加-Wl,--whole-archive,然后在它们之后添加-Wl,--no-whole-archive(这样标准库导入不会被共享库导出)。

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


补充:所以我想尽可能使用标准的 cmake 东西,这样我就不必为 windows 构建做任何额外的工作,因为 CMake 友好地删除了编译器正在构建的平台上不支持的定义。

【问题讨论】:

    标签: g++ cmake gnu ld


    【解决方案1】:

    好吧,比我想象的要容易得多。

    所以根据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?

    【讨论】:

    • 您是否找到了不需要空 empty.cpp 文件的解决方法?
    • 不,我一直使用 empty.cpp。
    • 如果你不想用垃圾文件污染你的真实源代码树,我看起来你可以做file(WRITE empty.cpp "")
    • 如果您的编译器不喜欢编译空的 cpp 文件(错误消息),请牺牲二进制文件中的几个字节并将“”替换为“int dummy = 0;”之类的内容。
    • 在 Windows 上是 /WHOLEARCHIVE
    【解决方案2】:

    如果您自己构建静态库,您可以使用这种方法:https://stackoverflow.com/a/29824424/4069571 即首先将它们构建为对象库,然后将它们链接到各自的共享库和静态库中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多